Structured financial reporting is latest and greatest method of exchanging financial data and reports. The use of XBRL is expanding allover the world, and it is becoming the standard method for exchanging structured financial reports.

The objective of this document is to provide the reader with a basic understanding of what XBRL is, what it does, and how it is implemented.

Parts of this material depends heavily, and refers to the XBRL Taxonomy Development Handbook published by XBRL US and publicly available on the their website. As mentioned in the preface of the handbook, it was created as a guide for creating XBRL taxonomies based on XBRL US experience, which makes it a very valuable resource for anyone or organization interested in implementation of XBRL.

1 Outcomes

This material should provide:

  • Basic understanding of XBRL and its components
  • Familiarity with core terminology and what it refers to
  • Basic understanding of Taxonomy and instance document
  • Basic understanding of the process of development of an XBRL taxonomy and structured reporting process
  • Understanding the ecosystem of structured financial reporting and the supporting technologies

2 Back in time

To explain the most basic concept of XBRL we need to take a trip back in time, to the ancient Egyptian writings.


[Image by Osama Shukir Muhammed Amin FRCP(Glasg), CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0, via Wikimedia Commons]

In the image above we see some writing encapsulated in an oval shape called “Cartouche”, according to the common understanding, this means that the encapsulated writing represents a royal name. The ancient Egyptians choose this method to draw the attention to the information by marking or “tagging” this important information by the oval shape.

XBRL does the same thing, it is tagging important financial information included in a report, in the case of XBRL, this tagging has consequences when the information is processed by a computer.

3 Why XBRL and what is it exactly?

XBRL stands for eXtensible Business Reporting Language, and it is usually described in terms of what it does, in brief, XBRL provides standards for storing and electronic communication of financial information enabling efficient processing, storage, retrieval, analysis and comparison of the information.

The increase in size of data and regulatory requirements derives the need for more efficient and structured methods to handle all this data and make convert it into a resource rather than a burden.

3.1 Who uses XBRL?

The XBRL Taxonomy Development Handbook in page 6 lists successful implementation of XBRL around the worlds, that includes:

  • United States: Stock exchange commission (SEC), and Financial Depository Insurance Corporation (FDIC) with total reporting entities of over 17,500

  • United Kingdom: Her Majesty’s Revenues & Customs (HMRC), and Companies House with reporting entities of over 2 million

  • Spain: Business Registrar, Banking Regulator, Securities Regulation, Accounting Oversight and State Federal Comptroller with reporting entities of over 800,000

  • Others: Europe (European Single Electronic Format ESEF), India, Singapore, South Korea, Italy, Peru, World bank and many others

  • Governments and government agencies allover the world are using XBRL, countries like Netherlands and Australia implemented Standard Business Reporting (SBR) programs which are programs designed to reduce regulatory burden for businesses and relys heavily on XBRL.

Currently XBRL international website lists more than 20 XBRL jurisdictions (a jurisdiction is a local representative for XBRL acting as the primary liaison to national government, technology firms and business communities)

3.2 How do we collect financial data

The methods and processes of financial data collection evolved over time, we started with paper based submissions, then computer discs, then electronic submissions through web based portals. XBRL is the next new thing in this evolution, and it adds value in a lot of ways such as:

  • It provides for a stable structure of the data content
  • It separates data content from the form of the submission
  • Provide for automation, which increases accuracy, cost and time savings

And many more benefits relating to the quality and richness of that data that we will look into later.

3.3 Current issues that XBRL addresses

As mentioned, XBRL provides for structured contextually rich machine readable data, which allows for automation, and that address most of the main data issues in general, for regulators and for issuers.

General Issues:

  • Machine Readable: reports with XBRL tagging can be consumed and analyzed by computers through XBRL enabled software (XBRL Processors) as opposed to paper based or unstructured reports.
  • Interoperability: XBRL is self-describing and uses XML syntax which makes the information in XBRL system independent, in other words, the same XBRL information package can be consumed by any system that has XBRL enabled software, which addresses compatibility issues.
  • It provides for a common set of rules that can be used in exchanging any financial information, hence it provides a common language for exchanging data, addressing comparability issues.
  • XBRL provides for automated means of compiling, transmitting, validating and analyzing financial data, which increase efficiency, time and cost saving and at the same time increasing quality of data.
  • XBRL provides high quality, contextually rich financial data rather than fragmented data.
  • XBRL is free and opensource standard, with no licensing fees, addresses issues of propitiatory standards and software, it should be noted that XBRL enabled software is not free.

Regulator Issues:

  • High volumes of data and reports: as mentioned, XBRL provides for automation in collecting and processing data, which facilitates handling high volumes in an accurate and efficient manner.
  • Review and validation: XBRL give financial report a structure that enable creation of validation rules based on regulations, business rules and any other criteria, and that in turn enables quick corrective action to be taken when needed.
  • Data can be stored for cross checking and further analysis and comparison.
  • Single source of the truth, XBRL structure allows data to be used for many purposes, for example, same report can contain data structures required for a regulator, census, taxes …

Issuer Issues:

  • Simplifies the compilation of reports required by multiple regulators from the same dataset.
  • XBRL taxonomies and the related guides issued by regulators provide for clear and unambiguous reporting requirements, and simplifies compliance.
  • Reduces the chance of costly errors.

Why XBRL? In short, it addresses most current issues relating to exchange of financial data, it is widely used allover the world, and it is simply the next step in the evolution of financial data exchange systems.

3.4 What is Extensible Business Reporting Language (XBRL)?

The Specifications
Technically XBRL is based on XML (eXtensible Markup Language), it can be said that XBRL is an XML extension optimized to deal with business information. In other words, XBRL does what it does by being based on XML.

XBRL is a set of specifications developed and maintained by XBRL International. The base XBRL specification (now version 2.1) is stable since 2003, with additional specifications being added to augment it such as XBRL Dimensions.

XBRL specification are freely available without licensing, note that this doesn’t apply for XBRL enabled software which might have licensing fees.

Data Model
XBRL specifications are tools that enables the definition of dictionaries, data models and rules called XBRL Taxonomies, also XBRL specifications provide the tools to create structured financial reports based on XBRL Taxonomies, these financial reports are called XBRL Instances.

So we can say that XBRL is the set of tools used to create data models and structures that are the basis for structured financial reporting.

Communication Language
The purpose of XBRL is to enable exchange of structured financial data between systems, some times the term “transport model” is used to refer to XBRL.

“A Transport Model serves as an organizational structure when moving data from a source to a consumer”

Understand XBRL and how it does what it does, start with XML, in the next section we will go through some of XML concepts that are relevant to understanding XBRL.

3.5 XML and markup languages

Markup languages in general tags the content of a file or a document in a way that makes it machine readable, i.e. when processed by a computer, the tags tell the computer what to do with the content.

Markup languages has different purposes, for example Hyper Text Markup Language (“HTML”) tags tell the computer how to display the content, while few of the main purposes of XML is to store, organize and transport content between systems.

Markup languages are usually system independent, for example all systems have tools to read and parse XML, in other words, an XML file created in a Windows system can be read an parsed by a Linux based system.

3.6 XML Basics

As mentioned XML is a markup language, and it is a set of specifications, rules and tools for describing, storing, and transporting data between systems.

Assume that we want to encode a table of invoices into XML, a fragment of that XML might look as follows:

<table> 
  <invoice CustomerName="abc" 
           InvoiceNum="101">589.91
  </invoice>
</table>

3.6.1 XML Form

XML document is composed of elements, each element starts with an opening tag and ends with a closing tag, there can be values or other elements within the opening and closing tags. The XML structure is in the form of a tree, having a root element containing all other elements.

<table> and </table> in the above XML fragment are the opening and closing tags of the root element called table. In the above fragment, the root element has only one child element called invoice. The invoice opening tag contains other information in the form of key, value pairs customerName="abc", invoiceNum=101, these are called attributes, which attaches more information about the element. finally we have a value 589.91 between the invoice opening and closing tag, in this case representing the invoice amount.

To be usable, XML must be well formed XML, a well formed XML has the following:

  • All XML elements must be contained in one root element
  • Each element must have an opening and closing tag
  • Elements must be properly nested
  • Attributes must be quoted

For more about XML well formedness see W3Schools XML Tutorial

3.6.2 Storing Data in XML

Let’s assume we have a table of invoices that we need to store in XML format and send over to another computer, first let’s construct the table:

# Generate a table, same as previous test but 50 rows
set.seed(42)
# Number of rows in the table
table_rows <- 10 
# Customer names
customer_names <- c("abc", "mno","xyz")
# Data frame
tbl_1 <- data.frame(
  CustomerName = sample(customer_names, table_rows, replace = T),
  InvoiceNum = sort(sample(100:999, table_rows)),
  InvoiceDate = sort(sample(seq(as.Date('2000-01-01'), 
                                as.Date('2000-12-31'), 
                                by="day"), table_rows)
                     ),
  InvoiceCurrency = rep("CU",table_rows),
  InvoiceAmt = round(runif(table_rows, min = 100, max = 1000),2), stringsAsFactors = F)

# Display first few rows of the data.frame
head(tbl_1)

Now let’s convert that table to XML format:

# This code converts the invoices table to an XML document 
# and saves it to file

# Create xml root element
xml_root <- xml2::xml_new_root('table')

# Attach each row of the table as an <invoice> element
for(r in asplit(tbl_1,1)) {
  nd <- xml2::xml_add_child(xml_root, 'invoice')
  for(r_n in names(r)){
    xml2::xml_add_child(.x=nd, .value = r_n, r[[r_n]] )
  }
}

# Write the xml document to file
xml_out_tbl_1 <- here::here('xml_files','xml_out.xml')
invisible(xml2::write_xml(xml_root, xml_out_tbl_1))

The resulting XML file looks like this:

<?xml version="1.0" encoding="UTF-8"?>


<table>


  <invoice>


    <CustomerName>abc</CustomerName>


    <InvoiceNum>264</InvoiceNum>


    <InvoiceDate>2000-01-05</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>650.60</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>abc</CustomerName>


    <InvoiceNum>396</InvoiceNum>


    <InvoiceDate>2000-01-24</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>441.60</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>abc</CustomerName>


    <InvoiceNum>455</InvoiceNum>


    <InvoiceDate>2000-04-18</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>492.19</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>abc</CustomerName>


    <InvoiceNum>509</InvoiceNum>


    <InvoiceDate>2000-07-30</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>133.69</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>mno</CustomerName>


    <InvoiceNum>631</InvoiceNum>


    <InvoiceDate>2000-09-15</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>976.19</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>mno</CustomerName>


    <InvoiceNum>700</InvoiceNum>


    <InvoiceDate>2000-10-09</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>488.58</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>mno</CustomerName>


    <InvoiceNum>721</InvoiceNum>


    <InvoiceDate>2000-10-24</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>961.82</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>abc</CustomerName>


    <InvoiceNum>978</InvoiceNum>


    <InvoiceDate>2000-11-09</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>898.98</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>xyz</CustomerName>


    <InvoiceNum>981</InvoiceNum>


    <InvoiceDate>2000-12-13</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>675.98</InvoiceAmt>


  </invoice>


  <invoice>


    <CustomerName>xyz</CustomerName>


    <InvoiceNum>998</InvoiceNum>


    <InvoiceDate>2000-12-25</InvoiceDate>


    <InvoiceCurrency>CU</InvoiceCurrency>


    <InvoiceAmt>973.87</InvoiceAmt>


  </invoice>


</table>

Examining the resulting XML file, each <invoice> element has 5 child elements representing information about each invoice, with each of those child elements storing the information as its value. Now if the focus of this table/report is on the invoice amount invoiceAmt, then it might be better to have the invoice amount information as the only value, and everything else might be better represented as an attribute. Attributes usually give additional contextual information about the element and its value, we may call those attributes aspects or even dimensions. So let’s try to rewrite the XML in a different way to reflect this:

# Re-write the xml file with attributes

# create root element for the new XML
xml_root_2 <- xml2::xml_new_root('table')

# define children with attributes
for(r in asplit(tbl_1,1)) {
  nd <- xml2::xml_add_child(xml_root_2, 'invoice', r[[length(r)]])
  for(r_n in names(r)){
    xml2::xml_attrs(nd) <- r[-length(r)]
  }
}

# Write the xml document to file
xml_out_tbl_2 <- here::here('xml_files','xml_out_2.xml')
invisible(xml2::write_xml(xml_root_2, xml_out_tbl_2))

The resulting New XML file looks like this:

<?xml version="1.0" encoding="UTF-8"?>


<table>


  <invoice CustomerName="abc" InvoiceNum="264" InvoiceDate="2000-01-05" InvoiceCurrency="CU">650.60</invoice>


  <invoice CustomerName="abc" InvoiceNum="396" InvoiceDate="2000-01-24" InvoiceCurrency="CU">441.60</invoice>


  <invoice CustomerName="abc" InvoiceNum="455" InvoiceDate="2000-04-18" InvoiceCurrency="CU">492.19</invoice>


  <invoice CustomerName="abc" InvoiceNum="509" InvoiceDate="2000-07-30" InvoiceCurrency="CU">133.69</invoice>


  <invoice CustomerName="mno" InvoiceNum="631" InvoiceDate="2000-09-15" InvoiceCurrency="CU">976.19</invoice>


  <invoice CustomerName="mno" InvoiceNum="700" InvoiceDate="2000-10-09" InvoiceCurrency="CU">488.58</invoice>


  <invoice CustomerName="mno" InvoiceNum="721" InvoiceDate="2000-10-24" InvoiceCurrency="CU">961.82</invoice>


  <invoice CustomerName="abc" InvoiceNum="978" InvoiceDate="2000-11-09" InvoiceCurrency="CU">898.98</invoice>


  <invoice CustomerName="xyz" InvoiceNum="981" InvoiceDate="2000-12-13" InvoiceCurrency="CU">675.98</invoice>


  <invoice CustomerName="xyz" InvoiceNum="998" InvoiceDate="2000-12-25" InvoiceCurrency="CU">973.87</invoice>


</table>

Now that we have modeled our information in an acceptable form, we can try to re-construct the table from the XML, here I am using Rscript xml2 library to do that, but it can be done on any system that is capable of parsing XML files:

# Read xml file
xml_tbl <- xml2::read_xml(xml_out_tbl_2)

# find all invoice elements
invoices <- xml2::xml_find_all(xml_tbl, './/invoice')
values <- xml2::xml_find_all(xml_tbl, './/invoice/text()') %>% xml2::as_list() %>% unlist()

# extract invoice attributes and values from all elements and convert to a dataframe
xml_to_tbl <- xml2::xml_attrs(invoices) %>% bind_rows() %>% 
  mutate(InvoiceAmt= as.double(values)) %>% as.data.frame()
# Correct data types
xml_to_tbl$InvoiceNum <- as.integer(xml_to_tbl$InvoiceNum)
xml_to_tbl$InvoiceDate <- as.Date(xml_to_tbl$InvoiceDate)
head(xml_to_tbl)
# Compare result of conversion to original table
paste("Matches Original: ", all_equal(xml_to_tbl, tbl_1)) # Should return TRUE
[1] "Matches Original:  TRUE"

3.6.3 XML Schema, Namespaces and Validation

As mentioned, XML is used to transport information between systems, and that an XML document is created, the next step will be to send to the destination system. But an important question arises, how do we make sure that the destination/receiving system is able to handle and verify the information in our document correctly? For example, the root element in the example document is called table, what should be expected to be included in a table element? Is it a table of invoices, or is it a table a piece of furniture?

To address the above questions, XML has mechanisms whereby elements in an XML document can be described and verified, these is mechanisms mainly depend on schema and namespaces.

Schema Is a component of XML (W3C recommendation) used to describe and validate elements in an XML document. Schema can be described as the blueprint of vocabulary used, what and how data is stored in an XML file, there are different schema languages such as Document Type Definitions (DTDs), Relax-NG, Schematron and W3C XSD (XML Schema Definitions). The focus will be on XSD as this is the Schema language used in XBRL.

Namespaces Is a component of XML (W3C recommendation) used for providing uniquely named elements and attributes in an XML document. XML document may contain elements from multiple vocabularies (schema), namespaces help in uniquely identifying elements from different vocabularies having identical names. A namespace takes the form of a URI, for example http://mynamespace.com/1/1. A namespace prefix can be declared in an XML document to refer to specific namespace using xmlns attribute, for example xmlns:myns=http://mynamespace.com/1/1.

Following with the invoices table example, a schema was created for this report (using any schema creation software), the schema insures the following:

  • Namespace http://myproject.com/test2/1 was given to refer to the vocabulary of the schema
  • The root element is called table and contains one or more invoice element
  • Each invoice element is required to have a specific set of attributes as follows:
    • InvoiceNum of data type positive integer
    • InvoiceDate of data type date
    • InvoiceCurrency a string that can be either “CU” or “CX”
    • CustomerName of data type string
    • Finally invoice value must be a positive number or 0

Schema file is as follows:

<?xml version="1.0" encoding="UTF-8"?>


<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"


    xmlns:inv="http://myproject.com/test2/1"


    targetNamespace="http://myproject.com/test2/1"


    elementFormDefault="qualified"


    >


    


    <xs:simpleType name="currType">


        <xs:annotation>


            <xs:documentation>Currency type selection either "CU" or "CX"


            </xs:documentation>


        </xs:annotation>


        <xs:restriction base="xs:string">


            <xs:enumeration value="CU" /> 


            <xs:enumeration value="CX" />


        </xs:restriction>


    </xs:simpleType>


    <xs:attributeGroup name="invoiceGrp">


        <xs:annotation>


            <xs:documentation>Type defining the invoice required information


            </xs:documentation>


        </xs:annotation>


        <xs:attribute name="InvoiceNum" type="xs:unsignedShort"


            use="required" />


        <xs:attribute name="InvoiceDate" type="xs:date"


            use="required" />


        <xs:attribute name="InvoiceCurrency" type="inv:currType"


            use="required" />


        <xs:attribute name="CustomerName" type="xs:string"


            use="required" />


    </xs:attributeGroup>


    <xs:simpleType name="positive_decimalType">


        <xs:annotation>


            <xs:documentation>Restriction on invoice amount to be always a


                positive number.</xs:documentation>


        </xs:annotation>


        <xs:restriction base="xs:decimal">


            <xs:minInclusive value="0" />


        </xs:restriction>


    </xs:simpleType>


    <xs:complexType name="invoiceType">


        <xs:annotation>


            <xs:documentation>Invoice type based using declared positive decimal


                type and invoice attributes group.</xs:documentation>


        </xs:annotation>


        <xs:simpleContent>


            <xs:extension base="inv:positive_decimalType">


                <xs:attributeGroup ref="inv:invoiceGrp" />


            </xs:extension>


        </xs:simpleContent>


    </xs:complexType>


    <xs:element name="table">


        <xs:annotation>


            <xs:documentation>Defines root node using declared invoiceType.


            </xs:documentation>


        </xs:annotation>


        <xs:complexType>


            <xs:sequence>


                <xs:element maxOccurs="unbounded" name="invoice"


                    type="inv:invoiceType" minOccurs="1" />


            </xs:sequence>


        </xs:complexType>


    </xs:element>


</xs:schema>

Now we need to change our XML file to reference the schema, that is done using the xmlns attribute and giving it a namespace prefix of ‘inv’, and providing the location of the schema file using xs:schemaLocation attribute, not that the later attribute is from xs=http://www.w3.org/2001/XMLSchema-instance namespace. The new file with the schema reference is named xml_out_2_schema.xml and and the relevant part of it looks as follows:

<inv:table xmlns:inv="http://myproject.com/test2/1" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
    xs:schemaLocation="http://myproject.com/test2/1 example_2_schema2.xsd">

Validation with no errors Before processing the XML file, the receiving computer will always validate the XML file against the referenced schema, we can do that here using Rscript xml2::xml_validate() function as follows:

# Read XML instance and schema
inst <- xml2::read_xml(here::here("xml_files","xml_out_2_schema.xml"))
schema <- xml2::read_xml(here::here("xml_files","example_2_schema2.xsd"))

# Validate XML instance against the schema
xml2::xml_validate(inst,schema)
[1] TRUE
attr(,"errors")
character(0)

Validating the first file returns TRUE with 0 errors, meaning that the file is valid according to the schema.

Validation with Errors
Now let’s change the file and test if the validation will detect the errors. We create a new file called xml_out_2_schema_errors.xml, and we change it to as follows:

  1. For the first invoice remove CustomerName attribute -> test missing attributes are detected
  2. For the second invoice change InvoiceNum value to string ix-> test inconsistent attribute datatype is detected
  3. For the third invoice change InvoiceCurrency value to XZ -> test only valid currency choices are allowed
  4. in the fourth invoice change the value from 133.69 to -133.69 -> test if only positive invoice amount values are allowed.

Then we run the validation again on the modified file, we should get an error this time:

# Read XML instance and schema",
inst_err <- xml2::read_xml(here::here("xml_files","xml_out_2_schema_errors.xml"))
schema <- xml2::read_xml(here::here("xml_files","example_2_schema2.xsd"))

# Validate XML instance against the schema
xml2::xml_validate(inst_err,schema)
[1] FALSE
attr(,"errors")
[1] "Element '{http://myproject.com/test2/1}invoice': The attribute 'CustomerName' is required but missing."                                                              
[2] "Element '{http://myproject.com/test2/1}invoice', attribute 'InvoiceNum': 'ix' is not a valid value of the atomic type 'xs:unsignedShort'."                           
[3] "Element '{http://myproject.com/test2/1}invoice', attribute 'InvoiceCurrency': [facet 'enumeration'] The value 'XZ' is not an element of the set {'CU', 'CX'}."       
[4] "Element '{http://myproject.com/test2/1}invoice', attribute 'InvoiceCurrency': 'XZ' is not a valid value of the atomic type '{http://myproject.com/test2/1}currType'."
[5] "Element '{http://myproject.com/test2/1}invoice': [facet 'minInclusive'] The value '-133.69' is less than the minimum value allowed ('0')."                           
[6] "Element '{http://myproject.com/test2/1}invoice': '-133.69' is not a valid value of the atomic type '{http://myproject.com/test2/1}positive_decimalType'."            

As shown above, a simple XML validator (xml2) detected all the errors and reported them.

3.6.5 Conclusion

XML as language and standards that provides for:
* Flexibility in data modeling
* Mechanisms for creating vocabularies (dictionaries)
* Mechanisms to validate XML content
* Mechanisms to link internal and external components

In addition to the above, XML is a stable and widely used language, and all that made XML suitable for the objectives of XBRL.

3.7 How Does XBRL Represent Data

Now that we are familiar with XML, we can get into the mechanisms of how XBRL represent data. In this section we first have an overview of the components and specifications of XBRL, some basic concepts of how XBRL represents data, finally we look at real life XBRL examples.

3.7.1 XBRL Components

The figure below tries to visualize the ingredients needed to end up with XBRL report (structured financial report):

  1. At the base, we have XML, the foundation everything else.

  2. As mentioned, XBRL specifications are based on XML, and these specifications are tools to build a reporting system based on XBRL.

  3. XBRL Taxonomy is the most critical ingredient, it uses XBRL specifications to build the structure and the data model for XBRL reporting, we can think of a Taxonomy as the Schema for a particular reporting domain. XBRL Taxonomy consists of:

    • Dictionary/Vocabulary of elements to be used in reporting, in XBRL terminology, these are called “Concepts”.
    • Type Definitions are components or extension of existing components that are the building blocks of Concepts.
    • Linkbases are groups of Xlinks that links concepts together to form a logical structure such as Presentation Linkbase used to link concept together in form to enable correct hierarchical presentation of these concepts in a report or any form of rendering.
    • Other Imported Taxonomies XBRL taxonomies can import other taxonomies to be part of the base taxonomy, this mechanism allows for reusing existing taxonomies rather than recreating something that already exits. All taxonomies imported by the base taxonomy and any other taxonomies that imported taxonomies import all together are called Discoverable Taxonomy Set (DTS). An example for that is the US-GAAP taxonomy which imports Stock Exchange Commission (SEC) taxonomies.
    • Extensions to other taxonomies maybe part of the base taxonomy.
    • Other Resources such as documentation and references may be included in an XBRL Taxonomy.
  4. XBRL Report consists of:

    • Schema containing any extension to the base taxonomy if extension is allowed.
    • Linkbases relevant to the report.
    • Instance Document containing the information for the current report.
  5. Consumer Data Model is where the data transported by XBRL ends up, taxonomies must consider consumer data needs in its design.

3.7.2 XBRL Specifications

As explained previously XBRL is an extension of XML, basically XBRL international used XML to define XBRL components and elements resulting in XBRL specifications.
As of date of this document, the relevant current XBRL specifications recommendations are as follows:

  • XBRL: Core XBRL Specs.
  • Dimensions: The XBRL Dimensions specification enables the reporting of multi-dimensional facts against dimensions defined in an XBRL taxonomy.
  • Extensible Enumerations: Allows for constraining the allowed values for primary reporting concepts (choices from specific list).
  • Formula: XBRL Formula provides a standard mechanism for defining rules in a taxonomy that can be applied against instance documents.
  • Generic Links: A link type with no predefined semantics or constraints. This can be used used as a building block for other specifications.
  • Generic Preferred Label: This specification introduces the preferred label feature for all relationships.
  • Global Ledger: XBRL Specs for transactional reporting.
  • Infrastructure: Specifications in this section are used to support the development of XBRL specifications and registries.
  • Inline XBRL: Inline XBRL, or iXBRL, provides a mechanism for embedding XBRL tags in HTML documents.
  • Registries: Registries provide a centralise list of definitions, allowing implementers to re-use suitable definitions created by others.
  • Table Linkbase: Provides a mechanism for taxonomy authors to define a tabular layout of facts. The resulting tables can be used for both presentation and data entry.
  • Taxonomy & Report Packages: Taxonomy Packages provide a standardised mechanism for providing documentation about the content of a taxonomy.
  • Versioning: Defines an XML syntax for an XBRL versioning Report.

Link for each recommendation includes the normative schema.

3.7.3 XBRL Representation of Data

In the introduction of TDH, it states that XBRL provides a platform to give data meaning [TDH section 1.1.3 page 2]. A piece of data really does not have a meaning without a context or means to associate data points, for example, data about a switch being on or off, doesn’t have much value if we don’t know what does this switch do and when was it on or off. XBRL gives meaning to data by providing layers of context.

3.7.3.1 Some Basics

The TDH presents the an example of a monthly expenses report [TDH section 2.2 page 15] of a person named “Bob”, the report is in the form of a table with its rows having expenses line items, and columns having months and amounts of expenses.

The TDH explains that expenses amounts alone do not convey much meaning unless associated with dimensions identifying additional information about the amounts, for example, who made the expenses, what is the nature of the expense, and in which periods expenses were made. The intersection of one or more of these dimensions with an amount creates a fact that has contextual meaning.

One of the basic concepts of XBRL design is that it identifies data points by multiple dimensions that gives enough context to the data point to be meaningful, like in the case of the expense report (TDH example), an amount of $900 in the first row, is identified by dimensions Food as nature of expense, and January as expense period, and Bob as the person who made the expense, which creates an XBRL Fact.

The TDH classifies dimensions that identifies facts in XBRL into 2 categories:

  1. Core Dimensions which includes:
    • Concept core dimension: A taxonomy element (dictionary/vocabulary) that provides the meaning for a fact (e.g. Fixed Assets, Revenue, Profit …), concepts are the building blocks of a taxonomy.
    • Period core dimension: Time frame or point of time relevant to the fact.
    • Reporting entity core dimension: The entity reporting the fact, also known as identifier
    • Unit core dimension: Unit of measurement of reported fact (e.g. USD, EURO, KM, KGM, USD/Share…), it is only required for numeric facts.
  2. Taxonomy Defined Dimensions: Concepts that exist for the purpose of grouping facts that should be interpreted in a similar way. Taxonomy Defined Dimensions do not directly define a fact but rather intersect with a fact to add further contextual or semantic information beyond what is added by the core dimensions, for example a country dimension for geographical allocation.

The Core Dimension and Taxonomy Defined Dimensions are defined in the XBRL Taxonomy or its extensions using XBRL components, and then used in an XBRL instance to report facts.

3.7.3.2 XBRL Elements Usage

XBRL specifications define how we can express a financial report, next we will look at the XBRL elements used to describe a data point.

Assuming we want to create an XBRL report form the monthly expenses example, first we need to use XBRL specifications to create a taxonomy containing the vocabulary and linkbases, then we can create an XBRL instance that contains the facts, let’s try to create few elements and discover the basic usage of XBRL elements.

3.7.3.3 Creating XBRL Taxonomy Concept

Concepts in an XBRL taxonomy are elements that provides a meaning for a fact, it is defined in the XBRL Taxonomy schema. Concepts make up the dictionary/vocabulary allowed to be used by the Taxonomy.

In case of a financial reporting taxonomy, concepts will describe numeric financial elements such as Net Profit, Assets or Liabilities, or narrative elements, like Accounting Policies. In short, a concept need to be created for every reportable element within the domain of the taxonomy, concepts are the backbone of the Taxonomy.

Let’s define Food concept (from the monthly expenses report), with the following characteristics:

  • Has a debit balance,
  • Its value Cannot be null (absent value), it can have a value of 0 though,
  • It is a monetary item, meaning that it needs to have a numeric value and a unit

Concept is defined in the taxonomy SCHEMA as follows:

<!-- From taxonomy schema file (.xsd) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:example="http://www.expenses.com/taxonomy"
  xmlns:xbrli="http://www.xbrl.org/2003/instance"
  attributeFormDefault="unqualified" elementFormDefault="qualified"
  targetNamespace="http://www.expenses.com/taxonomy">
    
    <element 
      xbrli:name="Food"
      xbrli:periodType="duration"
      xbrli:balance="debit"
      nillable="false"
      abstract="false"
      type="xbrli:monetaryItemType"
      substitustionGroup="xbrli:item"
      id="expense_Food"/>
        
</xs:schema>

Notes:

  • Namespace http://www.xbrl.org/2003/instance prefixed as xbrli was declared for XBRL specification schema to be able to use elements form that namespace.
  • We gave our taxonomy the namespace http://www.expenses.com/taxonomy prefixed as expenses
  • duration was selected for xbrli:periodType XBRL attribute, because this is an expense that occurs during a specified period (not a balance at a moment of time).
  • Each element must have a unique id.
  • Because we refered to XBRL specification, this schema document can be validated against XBRL sepcifications.

3.7.3.4 Creating XBRL instance Context

Assuming we want to report that Bob’s Food expenses for January 2020 was $900, note here that we attached 3 pieces of additional information to the expense amount, Food the concept core dimension, Bob the owner of the expense and January 2020 the period core dimension. we already defined the Food concept above, to attach the owner of the expenses and the period we need to use XBRL context element.

context is an XBRL element used in XBRL instance document (report) and referenced by one or more fact(s) in the XBRL report. It contains information about period, entity, and other taxonomy defined dimension relating to this context.

We can define a context for Bob owner, and January 2020 period as follows:

<!-- defined in instance document -->
<xbrl xmlns="http://www.xbrl.org/2003/instance"
      xmlns:expenses="http://www.expenses.com/taxonomy"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:lang="en-US">
    <!-- ... at least one link:schemaRef element goes here ... -->
    <context id="01">
      <entity>
        <identifier scheme="http://www.example.com/bob">Bob</identifier>
      </entity>
      <period>
        <startDate>2020-01-01</startDate>
        <endDate>2020-01-31</endDate>
      </period>
    </context>
</xbrl>

Notes XBRL instance document

  • XBRL instance document root element must be element <xbrl>
  • We referenced our taxonomy namespace to be able to use elements defined in that taxonomy.
  • We referenced XBRL schema (with no prefix) to be able to use XBRL.
  • Because of the references above, this XBRL instance document can be validated against XBRL specifications and our taxonomy.

3.7.3.5 Creating XBRL instance unit

XBRL requires that numeric facts has a reference to a unit [see XBRL specs 4.6.2]. And since our concept in monetary type which is numeric type, then we need to create a unit in our instance, in addition to the context before we are able to create a fact.

We declare a unit for United States Dollars using iso4217 taxonomy USD element as follows:

<!-- Added to previous instant document as child to <xbrl> element -->
<unit id="usd" xmlns:iso4217="http://www.xbrl.org/2003/iso4217">
  <measure>iso4217:USD</measure>
</unit>

3.7.3.6 Creating XBRL instance fact

Now that we have Food concept in our XBRL Taxonomy and have a context with id=01 and a unit of id="usd" in our instance document, we can create a fact for Bob’s Food expenses for the period of January 2020 for the amount of 900 United States Dollars as follows:

<!-- Added to previous instant document as child to <xbrl> element -->

<expenses:Food
  contextRef="01" 
  decimals="0" 
  id="fact_001" 
  unitRef="usd">900</expenses:Food>

3.7.3.7 XBRL Dimensions

As mentioned XBRL provides tools for reporting multidimensional facts, as mentioned core dimensions (Concept, period, reporting entity and unit) are available from the XBRL base specifications, in addition to some other tools, for taxonomy defined dimensions and more complex multidimensional structures XBRL Dimensions Specifications are used.

3.7.3.7.1 Additional Dimensions from base XBRL

XBRL element context has 2 additional features that can provide dimensionality to a fact, the <segment> and <scenario> as follows:

  • <segment>: is defined in XBRL specifications as “an optional container for additional mark-up that the preparer of an XBRL Instance SHOULD use to identify the business segment more completely in cases where the Entity identifier is insufficient.” It should also be mentioned that the <segment> element is used to link with taxonomy defined dimension using XBRL Dimensions Specifications.

  • <scenario>: XBRL specifications describes this element as “Business facts can be reported as actual, budgeted, restated, pro forma, etc. For internal reporting purposes, there can be an even greater variety of additional metadata that preparers want to associate with items. The optional element allows additional valid mark-up (see note above regarding segment) to be included for this purpose.”

Segment and Scenario Example

In the monthly expense report example, assume the Bob has 2 locations to track expenses for home and office (segments), also assume that Bob tracks budget and actuals (scenarios), to be able to include these dimensions in our report we need to first to create an extension taxonomy to include these elements as follows:

<!-- Report specific taxonomy extension -->
<schema targetNamespace="http://bobreport.com/xbrl/taxonomy" 
        xmlns:bob="http://bobreport.com/xbrl/taxonomy" 
        xmlns="http://www.w3.org/2001/XMLSchema" 
        xmlns:xbrli="http://www.xbrl.org/2003/instance">
          
    <!-- Type for segments -->
    <simpleType name="locationsType">
        <restriction base="token">
            <enumeration value="home"/>
            <enumeration value="office"/>
        </restriction>
    </simpleType>
          
    <!-- report specific segment sub-element -->
    <element name="locations" type="bob:locationsType" />
          
          
    <!-- Type for scenarios -->
    <simpleType name="actualBudgetType">
        <restriction base="token">
            <enumeration value="actual"/>
            <enumeration value="budget"/>
        </restriction>
    </simpleType>
          
    <!-- report specific scneario sub-element -->
    <element name="actualBudget" type="bob:actualBudgetType" />
          
          
          
</schema>
Note > Elements contained by the element MUST NOT be defined in the http://www.xbrl.org/2003/instance namespace. Also, they MUST NOT be in the substitution group for elements defined in the http://www.xbrl.org/2003/instance namespace. The element MUST NOT be empty.

To report facts on a segment and/or scenario elements, we need first to include the namespace http://bobreport.com/xbrl/taxonomy in our instance report to access these elements, then we need to create contexts with those elements then reference these contexts in the reported facts as follows:

<!-- Added to previous instant document as children to <xbrl> element -->
  <xbrl ....... xmlns:bob="http://bobreport.com/xbrl/taxonomy">
  <!-- ... at least one link:schemaRef element goes here ... -->
    <context id="02">
      <entity>
        <identifier scheme="http://www.example.com/bob">Bob</identifier>
      </entity>
      <period>
        <startDate>2020-01-01</startDate>
        <endDate>2020-01-31</endDate>
      </period>
  
      <segment>
          <bob:locations>bob:home</bob:location>
      </segment>
  
      <scenario>
          <bob:actualBudget>bob:actual</bob:actualBudget>
      </scenario>
  
    </context>

Now having context id=02 we can reference the facts that include actual figures for location home in our instance report.

3.7.3.7.2 Taxonomy defined dimensions

Taxonomy defined dimensions enable creation of complex structures in XBRL taxonomy and reports. This is achieved through the interactions between concepts and linkbases, this is best described in TDH section 2.2.5 page 21 as follows:

A taxonomy-defined dimension is a grouping of concepts that is used to add organizational structure to facts. These dimensional concepts should not be directly associated with a data point but rather are employed to indicate additional contextual information beyond the simple semantic identifier or what is provided through any of the other core dimensions. Expanding the expense example by attributing the monthly expenses to two people in the same household creates a level of complexity that cannot be easily represented with only concepts. Previously, there were only two dimensions: expenses (as rows) and months (as columns).

Some XBRL Dimensions terminology

  • Dimension: A qualifying characteristic that is used to uniquely define a data point (other than core dimensions) for example a “Geography Dimension”.
  • Domain: A set of related values. Examples of different domains for use on a “geography” dimension would be “Countries”, “Continents” or “States”. In XBRL, domains are defined using taxonomy elements that are used to group domain members.
  • Domain member: An element representing one of the possibilities within a domain.
  • Cube: A cube is defined by combining a set of dimensions with a set of concepts. Cubes are often referred to as “hypercubes”, as unlike a physical, 3-dimensional cube, a hypercube may have any number of dimensions.

All the above contructs are defined as concepts, but using XBRL specifications for the type and substitutionGroup attributes used for defining a concept.

The TDH at this section, splits the monthly expenses by Bob’s children, with each month split into 2 columns for each of Bob’s children. Assume that we want to organize this information in XBRL by doing the following:

  • Create a grouping concept or header called expenses to group all the expenses together,
  • Create persons dimension, and then create a domain for bobChildrenDomain and domain member for each child referenced in the report.

This can be implementd in XBRL as follows:

<!-- Report specific taxonomy extension -->
<schema targetNamespace="http://bobreport.com/xbrl/taxonomy" 
        xmlns:bob="http://bobreport.com/xbrl/taxonomy" 
        xmlns="http://www.w3.org/2001/XMLSchema" 
        xmlns:xbrli="http://www.xbrl.org/2003/instance">
        <!-- note here we included xbrl dimensions specs to have access to its elements -->
        xmlns:xbrldt="http://xbrl.org/2005/xbrldt"
        xmlns:dtr-types="http://www.xbrl.org/dtr/type/2020-01-21"
        
        <!-- create a grouping expense element -->
        <element abstract="true" 
                 id="expenses_abstract" 
                 name="ExpensesAbstract" 
                 nillable="true"
                 xbrli:balance="debit"
                 substitutionGroup="xbrli:item" 
                 type="xbrli:monetaryItemType" 
                 xbrli:periodType="duration"/>
        
        <!-- create persons dimension -->
        <element abstract="true" 
                 id="dim_01_persons" 
                 name="personsDim" 
                 nillable="true" 
                 substitutionGroup="xbrldt:dimensionItem" 
                 type="xbrli:stringItemType" 
                 xbrli:periodType="duration"/>
        <!-- create children domain -->        
        <element abstract="true" 
                id="domain_01_children" 
                name="ChildrenDomain" 
                nillable="true" 
                substitutionGroup="xbrli:item" 
                type="dtr-types:domainItemType" 
                xbrli:periodType="duration"/>
                  
          <!-- create domain member for each child -->
          <element 
              abstract="true" 
              id="members_01_childOneMember"
              name="ChildOneMember"
              nillable="true" 
              substitutionGroup="xbrli:item" 
              type="dtr-types:domainItemType" 
              xbrli:periodType="duration"/>
          <element 
              abstract="true" 
              id="members_02_childTwoMember"
              name="ChildTwoMember"
              nillable="true" 
              substitutionGroup="xbrli:item" 
              type="dtr-types:domainItemType" 
              xbrli:periodType="duration"/>
</schema>
<!-- note attributes usef from dtr-types and xbrldt namespaces>

Notes All elements defined above has the @abstract attribute as ture, this means that this element is not allowed to be used in XBRL instance document to report facts, this element is only for organization purposes.

Now we can reference the dimension in the in the instance document through <context> element as follows:

<!-- Added to previous instant document as children to <xbrl> element -->
  <xbrl ....... xmlns:bob="http://bobreport.com/xbrl/taxonomy"
                xmlns:xbrldi="http://xbrl.org/2006/xbrldi">
  <!-- ... at least one link:schemaRef element goes here ... -->
    <context id="03">
      <entity>
        <identifier scheme="http://www.example.com/bob">Bob</identifier>
      </entity>
      <period>
        <startDate>2020-01-01</startDate>
        <endDate>2020-01-31</endDate>
      </period>
  
      <segment>
          <bob:locations>bob:home</bob:location>
          <xbrldi:explicitMember
                  dimension="bob:personsDim">bob:ChildOneMember
          </xbrldi:explicitMember>
      </segment>
  
      <scenario>
          <bob:actualBudget>bob:actual</bob:actualBudget>
      </scenario>
  
    </context>

Now facts reporting actual expenses, for home location, relating to child one for January 2020 can use the above context and have all expenses groupped under one heading using the ExpensesAbstract element.

Notes There are two types of members explicit members, and typed member, the first type is where members are explicitly defined in the taxonomy and no other members can be used with that domain except the defined members. On the other hand typed members, only type of the member is defined in the taxonomy, and any can be used if it matched the type.

Keep in mind that XBRL dimensions specifications rely heavily on the linking mechanisms provided by XBRL through linkbases, which will be the next topic.

3.7.4 XBRL Linkbases

We have looked at how to create taxonomy elements and taxonomy defined dimensions, and how to use these elements in XBRL instance report, XBRL linkbases (based on XML XLink) provides for a mechanism to create relationships between those elements and with other internal or external resources to create a meaningful self-describing data structure.

3.7.4.1 The basics

As mentioned XBRL makes use of XML XLink specifications, generally speaking, there are two main categories of links:

  • Simple Links: A simple link in XLink creates a unidirectional hyperlink from one element to another through a URI. The element containing the link (the source element) is linked to a destination element. This destination element is not connected to the source element. This is common in HTML hyperlinking, where a link on one website may lead a user to an additional website, but that additional website may not contain a link back to the source location.

  • Extended Links: Provide for multiple resources at the source or destination to be connected via multiple arcs. An arc contains information about the origin, destination, and the behavior of a link between two resources. The origin resource and the destination resource are defined by labels. Through one or more arcs, extended links achieve complex connections among multiple resources. Like simple links, extended links can define relationships between elements within the same namespace or across different namespaces.

It is important to note that Extended Links creates relationships between elements using arcs that describes the behavior of the relationship.

XBRL specifications defines several types of links based on XLink specs, most common links and arcs are [based on XBRL Glossary]:

  • Presentation Links: An extended link providing for the organisation of taxonomy elements into a hierarchical structure with the aim of providing a means of visualising or navigating the taxonomy. [At a technical level, the presentation tree is defined using the parent-child arcrole in the XBRL specification]

  • Calculation Links: An extended lin providing relationships between concepts in a taxonomy for the purpose of describing and validating simple totals and subtotals. [At a technical level, these relationships are defined using the summation-item arcrole in the XBRL specification]

  • Label links: An extended link providing a relationship between concept and human readable description of a taxonomy component. XBRL labels can be defined in multiple languages and can be of multiple types, such as a “standard label”, which provides a concise name for the component, or a “documentation label” which provides a more complete definition of the component. Example of arcroles label, terseLabel, periodStartLabel, periodEndLabel, totalLabel

  • Definition Links: An extended providing for relationships that arranges pairs of concepts in a specific semantic relationship. These relationships may be above and beyond calculation or presentation relationships. Concept core dimensions cannot be used in a definition relationship, and is pimarily used for dimensional relationships in XBRL Dimensions specifications. Example arcroles hypercube-dimension, dimenstion-domain, domain-member, dimenstion-defualt

  • Reference link: An extended link providing for relation between elements of the taxonomy and external reference such as accounting standars, or laws. Example arcrole concept-reference.

  • Formula link: An extended link providing relations necessary to define formulae (XBRL Formula Specification) used in validating XBRL instances. Example arcrole variable-set, variable-set-filter.

  • Table Linkbase: an extended link providing relations needed for tabular view of a taxonomy or report that is used for presentation or data entry purposes. XBRL reporting templates can support complex, multi-dimensional reports, such as those seen in prudential reporting, and provide a business user-friendly view of the data. XBRL reporting templates are typically used in closed reporting programmes, where a template is prescribed by the collector. [At a technical level, XBRL reporting templates are defined using the Table Linkbase specification]

LS0tDQp0aXRsZTogIlhCUkwgLSBXaGF0IGlzIGl0PyINCnN1YnRpdGxlOiB8IA0KICAgICAgfCBBbiBvdmVydmlldyBvZiBYQlJMIFVTIFsqKl9YQlJMIFRheG9ub215IERldmVsb3BtZW50IEhhbmRib29rICgiVERIIilfKipdKGh0dHBzOi8veGJybC51cy94YnJsLXJlZmVyZW5jZS90ZGgvKQ0Kb3V0cHV0OiAgDQogIGh0bWxfbm90ZWJvb2s6ICANCiAgICB0aGVtZTogZmxhdGx5DQogICAgaGlnaGxpZ2h0OiBoYWRkb2NrICANCiAgICB0b2M6IHllcyAgDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBmYWxzZSANCiAgICB0b2NfZGVwdGg6IDUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcyANCiAgICBjb2RlX2ZvbGRpbmc6IG5vbmUgDQogICAgZmlnX2NhcHRpb246IHllcw0KLS0tDQo8c3R5bGU+DQpibG9ja3F1b3RlIHsNCiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7DQogICAgbWFyZ2luOiAwIDAgMjBweDsNCiAgICBmb250LXNpemU6IDEuMmVtIWltcG9ydGFudDsNCiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNlZWU7DQp9DQojVE9DIHsNCmZvbnQtc2l6ZTogc21hbGw7DQp3aGl0ZS1zcGFjZTogbm93cmFwOw0KfQ0KcHJlIGNvZGUgew0Kd2hpdGUtc3BhY2U6IHByZTsNCn0NCnByZSB7DQptYXgtaGVpZ2h0OiAzNTBweDsNCn0NCi5zb3VyY2VDb2RlIHsNCiAgICBvdmVyZmxvdzogYXV0bzsNCn0NCmJvZHkgew0KdGV4dC1hbGlnbjoganVzdGlmeTt9DQpibG9ja3F1b3RlIHsNCiAgICBmb250LXNpemU6IGluaGVyaXQ7DQogICAgZm9udC1zdHlsZTogb2JsaXF1ZTsNCn0NCjwvc3R5bGU+DQoqKioNCmBgYHtyIHNldHVwLCAgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KaGVyZTo6aV9hbSgnbm90ZWJvb2sveGJybF9ub3Rlc190b19zZWxmLlJtZCcpDQpzb3VyY2UoaGVyZTo6aGVyZSgnUicsICdoZWxwZXJGdW5jdGlvbnMuUicpKQ0Kb3B0aW9ucyh3aWR0aCA9IDIwMCkNCmh0bWx0b29sczo6dGFnTGlzdChybWFya2Rvd246Omh0bWxfZGVwZW5kZW5jeV9mb250X2F3ZXNvbWUoKSkNCmBgYA0KDQpTdHJ1Y3R1cmVkIGZpbmFuY2lhbCByZXBvcnRpbmcgaXMgbGF0ZXN0IGFuZCBncmVhdGVzdCBtZXRob2Qgb2YgZXhjaGFuZ2luZyBmaW5hbmNpYWwgZGF0YSBhbmQgcmVwb3J0cy4gVGhlIHVzZSBvZiBYQlJMIGlzIGV4cGFuZGluZyBhbGxvdmVyIHRoZSB3b3JsZCwgYW5kIGl0IGlzIGJlY29taW5nIHRoZSBzdGFuZGFyZCBtZXRob2QgZm9yIGV4Y2hhbmdpbmcgc3RydWN0dXJlZCBmaW5hbmNpYWwgcmVwb3J0cy4gDQoNClRoZSBvYmplY3RpdmUgb2YgdGhpcyBkb2N1bWVudCBpcyB0byBwcm92aWRlIHRoZSByZWFkZXIgd2l0aCBhIGJhc2ljIHVuZGVyc3RhbmRpbmcgb2YgX3doYXQgWEJSTCBpc18sIF93aGF0IGl0IGRvZXNfLCBhbmQgX2hvdyBpdCBpcyBpbXBsZW1lbnRlZF8uDQoNClBhcnRzIG9mIHRoaXMgbWF0ZXJpYWwgZGVwZW5kcyBoZWF2aWx5LCBhbmQgcmVmZXJzIHRvIHRoZSBbKipfWEJSTCBUYXhvbm9teSBEZXZlbG9wbWVudCBIYW5kYm9va18qKl0oaHR0cHM6Ly94YnJsLnVzL3hicmwtcmVmZXJlbmNlL3RkaC8pIHB1Ymxpc2hlZCBieSBbWEJSTCBVU10oaHR0cHM6Ly94YnJsLnVzLykgYW5kIHB1YmxpY2x5IGF2YWlsYWJsZSBvbiB0aGUgdGhlaXIgd2Vic2l0ZS4gQXMgbWVudGlvbmVkIGluIHRoZSBwcmVmYWNlIG9mIHRoZSBoYW5kYm9vaywgaXQgd2FzIGNyZWF0ZWQgYXMgYSBndWlkZSBmb3IgY3JlYXRpbmcgWEJSTCB0YXhvbm9taWVzIGJhc2VkIG9uIFhCUkwgVVMgZXhwZXJpZW5jZSwgd2hpY2ggbWFrZXMgaXQgYSB2ZXJ5IHZhbHVhYmxlIHJlc291cmNlIGZvciBhbnlvbmUgb3Igb3JnYW5pemF0aW9uIGludGVyZXN0ZWQgaW4gaW1wbGVtZW50YXRpb24gb2YgWEJSTC4NCg0KIyBPdXRjb21lcyAgDQoNClRoaXMgbWF0ZXJpYWwgc2hvdWxkIHByb3ZpZGU6ICANCg0KKiBCYXNpYyB1bmRlcnN0YW5kaW5nIG9mIFhCUkwgYW5kIGl0cyBjb21wb25lbnRzICANCiogRmFtaWxpYXJpdHkgd2l0aCBjb3JlIHRlcm1pbm9sb2d5IGFuZCB3aGF0IGl0IHJlZmVycyB0byAgDQoqIEJhc2ljIHVuZGVyc3RhbmRpbmcgb2YgVGF4b25vbXkgYW5kIGluc3RhbmNlIGRvY3VtZW50ICANCiogQmFzaWMgdW5kZXJzdGFuZGluZyBvZiB0aGUgcHJvY2VzcyBvZiBkZXZlbG9wbWVudCBvZiBhbiBYQlJMIHRheG9ub215IGFuZCBzdHJ1Y3R1cmVkIHJlcG9ydGluZyBwcm9jZXNzICANCiogVW5kZXJzdGFuZGluZyB0aGUgZWNvc3lzdGVtIG9mIHN0cnVjdHVyZWQgZmluYW5jaWFsIHJlcG9ydGluZyBhbmQgdGhlIHN1cHBvcnRpbmcgdGVjaG5vbG9naWVzICANCg0KIyBCYWNrIGluIHRpbWUgIA0KDQpUbyBleHBsYWluIHRoZSBtb3N0IGJhc2ljIGNvbmNlcHQgb2YgWEJSTCB3ZSBuZWVkIHRvIHRha2UgYSB0cmlwIGJhY2sgaW4gdGltZSwgdG8gdGhlIGFuY2llbnQgRWd5cHRpYW4gd3JpdGluZ3MuDQoNClshW10oaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy9hL2EzL0JpcnRoX2FuZF9UaHJvbmVfY2FydG91Y2hlc19vZl9waGFyYW9oX1NldGlfSSUyQ19mcm9tX0tWMTdfYXRfdGhlX1ZhbGxleV9vZl90aGVfS2luZ3MlMkNfRWd5cHQuX05ldWVzX011c2V1bS5qcGcpe3dpZHRoPTMwJSBoZWlnaHQ9MzAlfV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FydG91Y2hlKXt0YXJnZXQ9X2JsYW5rfSAgDQo8c3ViPl9bSW1hZ2UgYnkgT3NhbWEgU2h1a2lyIE11aGFtbWVkIEFtaW4gRlJDUChHbGFzZyksIENDIEJZLVNBIDQuMCA8aHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMD4sIHZpYSBXaWtpbWVkaWEgQ29tbW9uc11fPHN1Yj4NCg0KSW4gdGhlIGltYWdlIGFib3ZlIHdlIHNlZSBzb21lIHdyaXRpbmcgZW5jYXBzdWxhdGVkIGluIGFuIG92YWwgc2hhcGUgY2FsbGVkICJDYXJ0b3VjaGUiLCBhY2NvcmRpbmcgdG8gdGhlIGNvbW1vbiB1bmRlcnN0YW5kaW5nLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGVuY2Fwc3VsYXRlZCB3cml0aW5nIHJlcHJlc2VudHMgYSByb3lhbCBuYW1lLiBUaGUgYW5jaWVudCBFZ3lwdGlhbnMgY2hvb3NlIHRoaXMgbWV0aG9kIHRvIGRyYXcgdGhlIGF0dGVudGlvbiB0byB0aGUgaW5mb3JtYXRpb24gYnkgbWFya2luZyBvciAidGFnZ2luZyIgdGhpcyBpbXBvcnRhbnQgaW5mb3JtYXRpb24gYnkgdGhlIG92YWwgc2hhcGUuDQoNClhCUkwgZG9lcyB0aGUgc2FtZSB0aGluZywgaXQgaXMgX3RhZ2dpbmdfIGltcG9ydGFudCBmaW5hbmNpYWwgaW5mb3JtYXRpb24gaW5jbHVkZWQgaW4gYSByZXBvcnQsIGluIHRoZSBjYXNlIG9mIFhCUkwsIHRoaXMgdGFnZ2luZyBoYXMgY29uc2VxdWVuY2VzIHdoZW4gdGhlIGluZm9ybWF0aW9uIGlzIHByb2Nlc3NlZCBieSBhIGNvbXB1dGVyLg0KDQoNCiMgV2h5IFhCUkwgYW5kIHdoYXQgaXMgaXQgZXhhY3RseT8NCg0KX19YQlJMX18gc3RhbmRzIGZvciBfZVh0ZW5zaWJsZSBCdXNpbmVzcyBSZXBvcnRpbmcgTGFuZ3VhZ2VfLCBhbmQgaXQgaXMgdXN1YWxseSBkZXNjcmliZWQgaW4gdGVybXMgb2Ygd2hhdCBpdCBkb2VzLCBpbiBicmllZiwgWEJSTCBwcm92aWRlcyBzdGFuZGFyZHMgZm9yIHN0b3JpbmcgYW5kIGVsZWN0cm9uaWMgY29tbXVuaWNhdGlvbiBvZiBmaW5hbmNpYWwgaW5mb3JtYXRpb24gZW5hYmxpbmcgZWZmaWNpZW50IHByb2Nlc3NpbmcsIHN0b3JhZ2UsIHJldHJpZXZhbCwgYW5hbHlzaXMgYW5kIGNvbXBhcmlzb24gb2YgdGhlIGluZm9ybWF0aW9uLiANCg0KVGhlIGluY3JlYXNlIGluIHNpemUgb2YgZGF0YSBhbmQgcmVndWxhdG9yeSByZXF1aXJlbWVudHMgZGVyaXZlcyB0aGUgbmVlZCBmb3IgbW9yZSBlZmZpY2llbnQgYW5kIHN0cnVjdHVyZWQgbWV0aG9kcyB0byBoYW5kbGUgYWxsIHRoaXMgZGF0YSBhbmQgbWFrZSBjb252ZXJ0IGl0IGludG8gYSByZXNvdXJjZSByYXRoZXIgdGhhbiBhIGJ1cmRlbi4gDQoNCiMjIFdobyB1c2VzIFhCUkw/ICANCg0KVGhlIFhCUkwgVGF4b25vbXkgRGV2ZWxvcG1lbnQgSGFuZGJvb2sgaW4gcGFnZSA2IGxpc3RzIHN1Y2Nlc3NmdWwgaW1wbGVtZW50YXRpb24gb2YgWEJSTCBhcm91bmQgdGhlIHdvcmxkcywgdGhhdCBpbmNsdWRlczoNCg0KKiAqKlVuaXRlZCBTdGF0ZXMqKjogU3RvY2sgZXhjaGFuZ2UgY29tbWlzc2lvbiAoU0VDKSwgYW5kIEZpbmFuY2lhbCBEZXBvc2l0b3J5IEluc3VyYW5jZSBDb3Jwb3JhdGlvbiAoRkRJQykgd2l0aCB0b3RhbCByZXBvcnRpbmcgZW50aXRpZXMgb2Ygb3ZlciAxNyw1MDAgIA0KKiAqKlVuaXRlZCBLaW5nZG9tKio6IEhlciBNYWplc3R54oCZcyBSZXZlbnVlcyAmIEN1c3RvbXMgKEhNUkMpLCBhbmQgQ29tcGFuaWVzIEhvdXNlIHdpdGggcmVwb3J0aW5nIGVudGl0aWVzIG9mIG92ZXIgMiBtaWxsaW9uICANCiogKipTcGFpbioqOiBCdXNpbmVzcyBSZWdpc3RyYXIsIEJhbmtpbmcgUmVndWxhdG9yLCBTZWN1cml0aWVzIFJlZ3VsYXRpb24sIEFjY291bnRpbmcgT3ZlcnNpZ2h0IGFuZCBTdGF0ZSBGZWRlcmFsIENvbXB0cm9sbGVyIHdpdGggcmVwb3J0aW5nIGVudGl0aWVzIG9mIG92ZXIgODAwLDAwMCAgDQoNCiogKipPdGhlcnMqKjogRXVyb3BlIChFdXJvcGVhbiBTaW5nbGUgRWxlY3Ryb25pYyBGb3JtYXQgRVNFRiksIEluZGlhLCBTaW5nYXBvcmUsIFNvdXRoIEtvcmVhLCBJdGFseSwgUGVydSwgV29ybGQgYmFuayBhbmQgbWFueSBvdGhlcnMgIA0KDQoqICoqR292ZXJubWVudHMgYW5kIGdvdmVybm1lbnQgYWdlbmNpZXMgKiphbGxvdmVyIHRoZSB3b3JsZCBhcmUgdXNpbmcgWEJSTCwgY291bnRyaWVzIGxpa2UgKipOZXRoZXJsYW5kcyoqIGFuZCAqKkF1c3RyYWxpYSoqIGltcGxlbWVudGVkIFsqKlN0YW5kYXJkIEJ1c2luZXNzIFJlcG9ydGluZyAoU0JSKSBwcm9ncmFtcyoqXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TdGFuZGFyZF9CdXNpbmVzc19SZXBvcnRpbmcpIHdoaWNoIGFyZSBwcm9ncmFtcyBkZXNpZ25lZCB0byByZWR1Y2UgcmVndWxhdG9yeSBidXJkZW4gZm9yIGJ1c2luZXNzZXMgYW5kIHJlbHlzIGhlYXZpbHkgb24gWEJSTC4NCg0KQ3VycmVudGx5IFhCUkwgaW50ZXJuYXRpb25hbCB3ZWJzaXRlIGxpc3RzIFttb3JlIHRoYW4gMjAgWEJSTCBqdXJpc2RpY3Rpb25zXShodHRwczovL3d3dy54YnJsLm9yZy90aGUtY29uc29ydGl1bS9hYm91dC9qdXJpc2RpY3Rpb25zLykgKGEganVyaXNkaWN0aW9uIGlzIGEgbG9jYWwgcmVwcmVzZW50YXRpdmUgZm9yIFhCUkwgIGFjdGluZyBhcyB0aGUgcHJpbWFyeSBsaWFpc29uIHRvIG5hdGlvbmFsIGdvdmVybm1lbnQsIHRlY2hub2xvZ3kgZmlybXMgYW5kIGJ1c2luZXNzIGNvbW11bml0aWVzKQ0KDQojIyBIb3cgZG8gd2UgY29sbGVjdCBmaW5hbmNpYWwgZGF0YQ0KDQpgYGB7ciBjaGFuZ2VzX2luX2RhdGFfY29sbGVjdGlvbiwgZWNobz1GQUxTRSwgZmlnLmNhcD0nSG93IHdlIGNvbGxlY3QgRGF0YSd9DQpEaWFncmFtbWVSOjpnclZpeigiDQoNCmRpZ3JhcGggd2l0aF90aXRsZSB7DQoNCiAgZ3JhcGggW3NwbGluZXM9b3J0aG8sIHJhbmtkaXI9TFIsIGxhYmVsPSdDaGFuZ2VzIGluIGhvdyB3ZSBjb2xsZWN0IGRhdGEnXQ0KICANCiAgbm9kZSBbc2hhcGU9Ym94LCBzdHlsZT0nZmlsbGVkJywgY29sb3I9dHJhbnNwYXJlbnQsIGZpbGxjb2xvcj0nI2Y1ZjVmNScsIGZvbnRuYW1lPUhlbHZldGljYSwgZm9udGNvbG9yPScjMmMzZTUwJ10NCiAgDQogIGFbbGFiZWw9J1BhcGVyIEJhc2VzIFN1Ym1pc3Npb25zJ107IA0KICBiW2xhYmVsPSdDb21wdXRlciBEaXNjJ107IA0KICBjW2xhYmVsPSdQcmVmb3JtYXR0ZWQgRHluYW1pYyBJbnB1dCBmb3JtcyddOyANCiAgZFtsYWJlbD0nV2ViIEJhc2VkIFBvcnRhbHMnXTsgZVtsYWJlbD1YQlJMXQ0KICANCiAgZWRnZVtjb2xvcj0nIzI0MjQyNCcsIHBlbndpZHRoPTAuMl0NCiAgDQogIGEgLT4gYiAtPiBjIC0+IGQgLT4gZQ0KfSAgICAgICAgICAgICAgICAgDQoiLCBoZWlnaHQ9IjEwMCUiLCB3aWR0aD0iMTAwJSIpDQpgYGANCg0KDQpUaGUgbWV0aG9kcyBhbmQgcHJvY2Vzc2VzIG9mIGZpbmFuY2lhbCBkYXRhIGNvbGxlY3Rpb24gZXZvbHZlZCBvdmVyIHRpbWUsIHdlIHN0YXJ0ZWQgd2l0aCBwYXBlciBiYXNlZCBzdWJtaXNzaW9ucywgdGhlbiBjb21wdXRlciBkaXNjcywgdGhlbiBlbGVjdHJvbmljIHN1Ym1pc3Npb25zIHRocm91Z2ggd2ViIGJhc2VkIHBvcnRhbHMuIFhCUkwgaXMgdGhlIG5leHQgbmV3IHRoaW5nIGluIHRoaXMgZXZvbHV0aW9uLCBhbmQgaXQgYWRkcyB2YWx1ZSBpbiBhIGxvdCBvZiB3YXlzIHN1Y2ggYXM6ICANCg0KICAqIEl0IHByb3ZpZGVzIGZvciBhIHN0YWJsZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGEgY29udGVudCAgDQogICogSXQgc2VwYXJhdGVzIGRhdGEgY29udGVudCBmcm9tIHRoZSBmb3JtIG9mIHRoZSBzdWJtaXNzaW9uIA0KICAqIFByb3ZpZGUgZm9yIGF1dG9tYXRpb24sIHdoaWNoIGluY3JlYXNlcyBhY2N1cmFjeSwgY29zdCBhbmQgdGltZSBzYXZpbmdzICANCiAgDQpBbmQgbWFueSBtb3JlIGJlbmVmaXRzIHJlbGF0aW5nIHRvIHRoZSBxdWFsaXR5IGFuZCByaWNobmVzcyBvZiB0aGF0IGRhdGEgdGhhdCB3ZSB3aWxsIGxvb2sgaW50byBsYXRlci4NCg0KIyMgQ3VycmVudCBpc3N1ZXMgdGhhdCBYQlJMIGFkZHJlc3Nlcw0KDQpBcyBtZW50aW9uZWQsIFhCUkwgcHJvdmlkZXMgZm9yIHN0cnVjdHVyZWQgY29udGV4dHVhbGx5IHJpY2ggbWFjaGluZSByZWFkYWJsZSBkYXRhLCB3aGljaCBhbGxvd3MgZm9yIGF1dG9tYXRpb24sIGFuZCB0aGF0IGFkZHJlc3MgbW9zdCBvZiB0aGUgbWFpbiBkYXRhIGlzc3VlcyBpbiBnZW5lcmFsLCBmb3IgcmVndWxhdG9ycyBhbmQgZm9yIGlzc3VlcnMuDQoNCioqR2VuZXJhbCBJc3N1ZXM6KiogIA0KDQoqIE1hY2hpbmUgUmVhZGFibGU6IHJlcG9ydHMgd2l0aCBYQlJMIHRhZ2dpbmcgY2FuIGJlIGNvbnN1bWVkIGFuZCBhbmFseXplZCBieSBjb21wdXRlcnMgdGhyb3VnaCBYQlJMIGVuYWJsZWQgc29mdHdhcmUgKFhCUkwgUHJvY2Vzc29ycykgYXMgb3Bwb3NlZCB0byBwYXBlciBiYXNlZCBvciB1bnN0cnVjdHVyZWQgcmVwb3J0cy4gICANCiogSW50ZXJvcGVyYWJpbGl0eTogWEJSTCBpcyBzZWxmLWRlc2NyaWJpbmcgYW5kIHVzZXMgWE1MIHN5bnRheCB3aGljaCBtYWtlcyB0aGUgaW5mb3JtYXRpb24gaW4gWEJSTCBzeXN0ZW0gaW5kZXBlbmRlbnQsIGluIG90aGVyIHdvcmRzLCB0aGUgc2FtZSBYQlJMIGluZm9ybWF0aW9uIHBhY2thZ2UgY2FuIGJlIGNvbnN1bWVkIGJ5IGFueSBzeXN0ZW0gdGhhdCBoYXMgWEJSTCBlbmFibGVkIHNvZnR3YXJlLCB3aGljaCBhZGRyZXNzZXMgX2NvbXBhdGliaWxpdHlfIGlzc3Vlcy4gIA0KKiBJdCBwcm92aWRlcyBmb3IgYSBjb21tb24gc2V0IG9mIHJ1bGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gZXhjaGFuZ2luZyBhbnkgZmluYW5jaWFsIGluZm9ybWF0aW9uLCBoZW5jZSBpdCBwcm92aWRlcyBhIGNvbW1vbiBsYW5ndWFnZSBmb3IgZXhjaGFuZ2luZyBkYXRhLCBhZGRyZXNzaW5nIF9jb21wYXJhYmlsaXR5XyBpc3N1ZXMuICAgIA0KKiBYQlJMIHByb3ZpZGVzIGZvciBhdXRvbWF0ZWQgbWVhbnMgb2YgY29tcGlsaW5nLCB0cmFuc21pdHRpbmcsIHZhbGlkYXRpbmcgYW5kIGFuYWx5emluZyBmaW5hbmNpYWwgZGF0YSwgd2hpY2ggaW5jcmVhc2UgX2VmZmljaWVuY3lfLCB0aW1lIGFuZCBjb3N0IHNhdmluZyBhbmQgYXQgdGhlIHNhbWUgdGltZSBpbmNyZWFzaW5nIHF1YWxpdHkgb2YgZGF0YS4gIA0KKiBYQlJMIHByb3ZpZGVzIGhpZ2ggcXVhbGl0eSwgY29udGV4dHVhbGx5IHJpY2ggZmluYW5jaWFsIGRhdGEgcmF0aGVyIHRoYW4gX2ZyYWdtZW50ZWRfIGRhdGEuICANCiogWEJSTCBpcyBmcmVlIGFuZCBvcGVuc291cmNlIHN0YW5kYXJkLCB3aXRoIG5vIGxpY2Vuc2luZyBmZWVzLCBhZGRyZXNzZXMgaXNzdWVzIG9mIHByb3BpdGlhdG9yeSBzdGFuZGFyZHMgYW5kIHNvZnR3YXJlLCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBYQlJMIGVuYWJsZWQgc29mdHdhcmUgaXMgbm90IGZyZWUuDQoNCg0KKipSZWd1bGF0b3IgSXNzdWVzKio6ICANCg0KKiBIaWdoIHZvbHVtZXMgb2YgZGF0YSBhbmQgcmVwb3J0czogYXMgbWVudGlvbmVkLCBYQlJMIHByb3ZpZGVzIGZvciBhdXRvbWF0aW9uIGluIGNvbGxlY3RpbmcgYW5kIHByb2Nlc3NpbmcgZGF0YSwgd2hpY2ggZmFjaWxpdGF0ZXMgaGFuZGxpbmcgaGlnaCB2b2x1bWVzIGluIGFuIGFjY3VyYXRlIGFuZCBlZmZpY2llbnQgbWFubmVyLiAgDQoqIFJldmlldyBhbmQgdmFsaWRhdGlvbjogWEJSTCBnaXZlIGZpbmFuY2lhbCByZXBvcnQgYSBzdHJ1Y3R1cmUgdGhhdCBlbmFibGUgY3JlYXRpb24gb2YgdmFsaWRhdGlvbiBydWxlcyBiYXNlZCBvbiByZWd1bGF0aW9ucywgYnVzaW5lc3MgcnVsZXMgYW5kIGFueSBvdGhlciBjcml0ZXJpYSwgYW5kIHRoYXQgaW4gdHVybiBlbmFibGVzIHF1aWNrIGNvcnJlY3RpdmUgYWN0aW9uIHRvIGJlIHRha2VuIHdoZW4gbmVlZGVkLiAgICANCiogRGF0YSBjYW4gYmUgc3RvcmVkIGZvciBjcm9zcyBjaGVja2luZyBhbmQgZnVydGhlciBhbmFseXNpcyBhbmQgY29tcGFyaXNvbi4gIA0KKiBTaW5nbGUgc291cmNlIG9mIHRoZSB0cnV0aCwgWEJSTCBzdHJ1Y3R1cmUgYWxsb3dzIGRhdGEgdG8gYmUgdXNlZCBmb3IgbWFueSBwdXJwb3NlcywgZm9yIGV4YW1wbGUsIHNhbWUgcmVwb3J0IGNhbiBjb250YWluIGRhdGEgc3RydWN0dXJlcyByZXF1aXJlZCBmb3IgYSByZWd1bGF0b3IsIGNlbnN1cywgdGF4ZXMgLi4uDQoNCioqSXNzdWVyIElzc3VlcyoqOiAgDQoNCiogU2ltcGxpZmllcyB0aGUgY29tcGlsYXRpb24gb2YgcmVwb3J0cyByZXF1aXJlZCBieSBtdWx0aXBsZSByZWd1bGF0b3JzIGZyb20gdGhlIHNhbWUgZGF0YXNldC4gICAgDQoqIFhCUkwgdGF4b25vbWllcyBhbmQgdGhlIHJlbGF0ZWQgZ3VpZGVzIGlzc3VlZCBieSByZWd1bGF0b3JzIHByb3ZpZGUgZm9yIGNsZWFyIGFuZCB1bmFtYmlndW91cyByZXBvcnRpbmcgcmVxdWlyZW1lbnRzLCBhbmQgc2ltcGxpZmllcyBjb21wbGlhbmNlLiAgDQoqIFJlZHVjZXMgdGhlIGNoYW5jZSBvZiBjb3N0bHkgZXJyb3JzLg0KICANCiAgDQogIA0KKipXaHkgWEJSTD8qKiBJbiBzaG9ydCwgaXQgYWRkcmVzc2VzIG1vc3QgY3VycmVudCBpc3N1ZXMgcmVsYXRpbmcgdG8gZXhjaGFuZ2Ugb2YgZmluYW5jaWFsIGRhdGEsIGl0IGlzIHdpZGVseSB1c2VkIGFsbG92ZXIgdGhlIHdvcmxkLCBhbmQgaXQgaXMgc2ltcGx5IHRoZSBuZXh0IHN0ZXAgaW4gdGhlIGV2b2x1dGlvbiBvZiBmaW5hbmNpYWwgZGF0YSBleGNoYW5nZSBzeXN0ZW1zLg0KDQojIyBXaGF0IGlzIEV4dGVuc2libGUgQnVzaW5lc3MgUmVwb3J0aW5nIExhbmd1YWdlIChYQlJMKT8NCg0KKipUaGUgU3BlY2lmaWNhdGlvbnMqKiAgIA0KVGVjaG5pY2FsbHkgWEJSTCBpcyBiYXNlZCBvbiBfX1hNTF9fIF8oZVh0ZW5zaWJsZSBNYXJrdXAgTGFuZ3VhZ2UpXywgaXQgY2FuIGJlIHNhaWQgdGhhdCAqKlhCUkwgaXMgYW4gWE1MIGV4dGVuc2lvbioqIG9wdGltaXplZCB0byBkZWFsIHdpdGggYnVzaW5lc3MgaW5mb3JtYXRpb24uIEluIG90aGVyIHdvcmRzLCAgWEJSTCBkb2VzIHdoYXQgaXQgZG9lcyBieSBiZWluZyBiYXNlZCBvbiAgWE1MLiAgDQoNCltYQlJMIGlzIGEgc2V0IG9mIHNwZWNpZmljYXRpb25zXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3NwZWNpZmljYXRpb25zLmh0bWwpIGRldmVsb3BlZCBhbmQgbWFpbnRhaW5lZCBieSBbWEJSTCBJbnRlcm5hdGlvbmFsXShodHRwczovL3d3dy54YnJsLm9yZy8pLiBUaGUgYmFzZSBYQlJMIHNwZWNpZmljYXRpb24gKG5vdyB2ZXJzaW9uIDIuMSkgaXMgc3RhYmxlIHNpbmNlIDIwMDMsIHdpdGggYWRkaXRpb25hbCBzcGVjaWZpY2F0aW9ucyBiZWluZyBhZGRlZCB0byBhdWdtZW50IGl0IHN1Y2ggYXMgWEJSTCBEaW1lbnNpb25zLiAgDQoNClhCUkwgc3BlY2lmaWNhdGlvbiBhcmUgZnJlZWx5IGF2YWlsYWJsZSB3aXRob3V0IGxpY2Vuc2luZywgbm90ZSB0aGF0IHRoaXMgZG9lc24ndCBhcHBseSBmb3IgWEJSTCBlbmFibGVkIHNvZnR3YXJlIHdoaWNoIG1pZ2h0IGhhdmUgbGljZW5zaW5nIGZlZXMuIA0KDQoqKkRhdGEgTW9kZWwqKiAgDQpYQlJMIHNwZWNpZmljYXRpb25zIGFyZSB0b29scyB0aGF0IGVuYWJsZXMgdGhlIGRlZmluaXRpb24gb2YgIGRpY3Rpb25hcmllcywgZGF0YSBtb2RlbHMgYW5kIHJ1bGVzIGNhbGxlZCAqKlhCUkwgVGF4b25vbWllcyoqLCBhbHNvIFhCUkwgc3BlY2lmaWNhdGlvbnMgcHJvdmlkZSB0aGUgdG9vbHMgdG8gY3JlYXRlIHN0cnVjdHVyZWQgZmluYW5jaWFsIHJlcG9ydHMgYmFzZWQgb24gWEJSTCBUYXhvbm9taWVzLCB0aGVzZSBmaW5hbmNpYWwgcmVwb3J0cyBhcmUgY2FsbGVkICoqWEJSTCBJbnN0YW5jZXMqKi4gIA0KDQpTbyB3ZSBjYW4gc2F5IHRoYXQgWEJSTCBpcyB0aGUgc2V0IG9mIHRvb2xzIHVzZWQgdG8gY3JlYXRlIGRhdGEgbW9kZWxzIGFuZCBzdHJ1Y3R1cmVzIHRoYXQgYXJlIHRoZSBiYXNpcyBmb3Igc3RydWN0dXJlZCBmaW5hbmNpYWwgcmVwb3J0aW5nLiANCg0KDQoqKkNvbW11bmljYXRpb24gTGFuZ3VhZ2UqKiAgDQpUaGUgcHVycG9zZSBvZiBYQlJMIGlzIHRvIGVuYWJsZSBleGNoYW5nZSBvZiBzdHJ1Y3R1cmVkIGZpbmFuY2lhbCBkYXRhIGJldHdlZW4gc3lzdGVtcywgc29tZSB0aW1lcyB0aGUgdGVybSAidHJhbnNwb3J0IG1vZGVsIiBpcyB1c2VkIHRvIHJlZmVyIHRvIFhCUkwuIA0KDQo+ICJBIF9UcmFuc3BvcnQgTW9kZWxfICBzZXJ2ZXMgYXMgYW4gb3JnYW5pemF0aW9uYWwgc3RydWN0dXJlIHdoZW4gbW92aW5nIGRhdGEgZnJvbSBhIHNvdXJjZSB0byBhIGNvbnN1bWVyIiBgciB0dWZ0ZTo6cXVvdGVfZm9vdGVyKCctLS0gW1RESCBzZWN0aW9uIDIuMS4yIHBhZ2UgMTBdKGh0dHBzOi8veGJybHVzLmdpdGh1Yi5pby9kb2NzL3RkaC5odG1sKScpYA0KDQoNClVuZGVyc3RhbmQgWEJSTCBhbmQgaG93IGl0IGRvZXMgd2hhdCBpdCBkb2VzLCBzdGFydCB3aXRoIFhNTCwgaW4gdGhlIG5leHQgc2VjdGlvbiB3ZSB3aWxsIGdvIHRocm91Z2ggc29tZSBvZiBYTUwgY29uY2VwdHMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gdW5kZXJzdGFuZGluZyBYQlJMLg0KDQojIyBYTUwgYW5kIG1hcmt1cCBsYW5ndWFnZXMgIA0KDQpNYXJrdXAgbGFuZ3VhZ2VzIGluIGdlbmVyYWwgdGFncyB0aGUgY29udGVudCBvZiBhIGZpbGUgb3IgYSBkb2N1bWVudCBpbiBhIHdheSB0aGF0IG1ha2VzIGl0IG1hY2hpbmUgcmVhZGFibGUsIGkuZS4gd2hlbiBwcm9jZXNzZWQgYnkgYSBjb21wdXRlciwgdGhlIHRhZ3MgdGVsbCB0aGUgY29tcHV0ZXIgd2hhdCB0byBkbyB3aXRoIHRoZSBjb250ZW50LiAgDQoNCk1hcmt1cCBsYW5ndWFnZXMgaGFzIGRpZmZlcmVudCBwdXJwb3NlcywgZm9yIGV4YW1wbGUgKipIeXBlciBUZXh0IE1hcmt1cCBMYW5ndWFnZSAoIkhUTUwiKSoqIHRhZ3MgdGVsbCB0aGUgY29tcHV0ZXIgaG93IHRvIGRpc3BsYXkgdGhlIGNvbnRlbnQsIHdoaWxlIGZldyBvZiB0aGUgbWFpbiBwdXJwb3NlcyBvZiAqKlhNTCoqIGlzIHRvIHN0b3JlLCBvcmdhbml6ZSBhbmQgdHJhbnNwb3J0IGNvbnRlbnQgYmV0d2VlbiBzeXN0ZW1zLg0KDQpNYXJrdXAgbGFuZ3VhZ2VzIGFyZSB1c3VhbGx5IHN5c3RlbSBpbmRlcGVuZGVudCwgZm9yIGV4YW1wbGUgYWxsIHN5c3RlbXMgaGF2ZSB0b29scyB0byByZWFkIGFuZCBwYXJzZSBYTUwsIGluIG90aGVyIHdvcmRzLCBhbiBYTUwgZmlsZSBjcmVhdGVkIGluIGEgV2luZG93cyBzeXN0ZW0gY2FuIGJlIHJlYWQgYW4gcGFyc2VkIGJ5IGEgTGludXggYmFzZWQgc3lzdGVtLiAgDQoNCg0KIyMgWE1MIEJhc2ljcyAgDQoNCkFzIG1lbnRpb25lZCBYTUwgaXMgYSBtYXJrdXAgbGFuZ3VhZ2UsIGFuZCBpdCBpcyBhIHNldCBvZiBzcGVjaWZpY2F0aW9ucywgcnVsZXMgYW5kIHRvb2xzIGZvciBkZXNjcmliaW5nLCBzdG9yaW5nLCBhbmQgdHJhbnNwb3J0aW5nIGRhdGEgYmV0d2VlbiBzeXN0ZW1zLg0KDQpBc3N1bWUgdGhhdCB3ZSB3YW50IHRvIGVuY29kZSBhIHRhYmxlIG9mIGludm9pY2VzIGludG8gWE1MLCBhIGZyYWdtZW50IG9mIHRoYXQgWE1MIG1pZ2h0IGxvb2sgYXMgZm9sbG93czoNCg0KYGBgeG1sDQo8dGFibGU+IA0KICA8aW52b2ljZSBDdXN0b21lck5hbWU9ImFiYyIgDQogICAgICAgICAgIEludm9pY2VOdW09IjEwMSI+NTg5LjkxDQogIDwvaW52b2ljZT4NCjwvdGFibGU+DQpgYGANCiMjIyBYTUwgRm9ybQ0KWE1MIGRvY3VtZW50IGlzIGNvbXBvc2VkIG9mIGVsZW1lbnRzLCBlYWNoIGVsZW1lbnQgc3RhcnRzIHdpdGggYW4gb3BlbmluZyB0YWcgYW5kIGVuZHMgd2l0aCBhIGNsb3NpbmcgdGFnLCB0aGVyZSBjYW4gYmUgdmFsdWVzIG9yIG90aGVyIGVsZW1lbnRzIHdpdGhpbiB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyB0YWdzLiBUaGUgWE1MIHN0cnVjdHVyZSBpcyBpbiB0aGUgZm9ybSBvZiBhIHRyZWUsIGhhdmluZyBhIHJvb3QgZWxlbWVudCBjb250YWluaW5nIGFsbCBvdGhlciBlbGVtZW50cy4gIA0KDQpgPHRhYmxlPmAgYW5kIGA8L3RhYmxlPmAgaW4gdGhlIGFib3ZlIFhNTCBmcmFnbWVudCBhcmUgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgPGNvZGUgc3R5bGU9ImNvbG9yOiByZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dGFnczwvY29kZT4gb2YgdGhlIHJvb3QgZWxlbWVudCBjYWxsZWQgYHRhYmxlYC4gSW4gdGhlIGFib3ZlIGZyYWdtZW50LCB0aGUgcm9vdCBlbGVtZW50IGhhcyBvbmx5IG9uZSBjaGlsZCBlbGVtZW50IGNhbGxlZCBgaW52b2ljZWAuIFRoZSBpbnZvaWNlIG9wZW5pbmcgdGFnIGNvbnRhaW5zIG90aGVyIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGtleSwgdmFsdWUgcGFpcnMgYGN1c3RvbWVyTmFtZT0iYWJjIiwgaW52b2ljZU51bT0xMDFgLCB0aGVzZSBhcmUgY2FsbGVkIDxjb2RlIHN0eWxlPSJjb2xvcjogcmVkOyBmb250LXdlaWdodDogYm9sZDsiPmF0dHJpYnV0ZXM8L2NvZGU+LCB3aGljaCBhdHRhY2hlcyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbGVtZW50LiBmaW5hbGx5IHdlIGhhdmUgYSB2YWx1ZSBgNTg5LjkxYCBiZXR3ZWVuIHRoZSBgaW52b2ljZWAgb3BlbmluZyBhbmQgY2xvc2luZyB0YWcsIGluIHRoaXMgY2FzZSByZXByZXNlbnRpbmcgdGhlIGludm9pY2UgYW1vdW50LiANCg0KVG8gYmUgdXNhYmxlLCBYTUwgbXVzdCBiZSB3ZWxsIGZvcm1lZCBYTUwsIGEgd2VsbCBmb3JtZWQgWE1MIGhhcyB0aGUgZm9sbG93aW5nOiAgDQoNCiogQWxsIFhNTCBlbGVtZW50cyBtdXN0IGJlIGNvbnRhaW5lZCBpbiBvbmUgcm9vdCBlbGVtZW50ICANCiogRWFjaCBlbGVtZW50IG11c3QgaGF2ZSBhbiBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyAgDQoqIEVsZW1lbnRzIG11c3QgYmUgcHJvcGVybHkgbmVzdGVkDQoqIEF0dHJpYnV0ZXMgbXVzdCBiZSBxdW90ZWQgDQoNCkZvciBtb3JlIGFib3V0IFhNTCB3ZWxsIGZvcm1lZG5lc3MgW3NlZSBXM1NjaG9vbHMgWE1MIFR1dG9yaWFsXShodHRwczovL3d3dy53M3NjaG9vbHMuY29tL3htbC94bWxfdmFsaWRhdG9yLmFzcCl7dGFyZ2V0PSJfYmxhbmsifSAgDQoNCiMjIyBTdG9yaW5nIERhdGEgaW4gWE1MICANCkxldCdzIGFzc3VtZSB3ZSBoYXZlIGEgdGFibGUgb2YgaW52b2ljZXMgdGhhdCB3ZSBuZWVkIHRvIHN0b3JlIGluIFhNTCBmb3JtYXQgYW5kIHNlbmQgb3ZlciB0byBhbm90aGVyIGNvbXB1dGVyLCBmaXJzdCBsZXQncyBjb25zdHJ1Y3QgdGhlIHRhYmxlOiAgDQoNCmBgYHtyIGV4YW1wbGVfMV90YmwsIHJlc3VsdHM9J2hvbGQnfQ0KIyBHZW5lcmF0ZSBhIHRhYmxlLCBzYW1lIGFzIHByZXZpb3VzIHRlc3QgYnV0IDUwIHJvd3MNCnNldC5zZWVkKDQyKQ0KIyBOdW1iZXIgb2Ygcm93cyBpbiB0aGUgdGFibGUNCnRhYmxlX3Jvd3MgPC0gMTAgDQojIEN1c3RvbWVyIG5hbWVzDQpjdXN0b21lcl9uYW1lcyA8LSBjKCJhYmMiLCAibW5vIiwieHl6IikNCiMgRGF0YSBmcmFtZQ0KdGJsXzEgPC0gZGF0YS5mcmFtZSgNCiAgQ3VzdG9tZXJOYW1lID0gc2FtcGxlKGN1c3RvbWVyX25hbWVzLCB0YWJsZV9yb3dzLCByZXBsYWNlID0gVCksDQogIEludm9pY2VOdW0gPSBzb3J0KHNhbXBsZSgxMDA6OTk5LCB0YWJsZV9yb3dzKSksDQogIEludm9pY2VEYXRlID0gc29ydChzYW1wbGUoc2VxKGFzLkRhdGUoJzIwMDAtMDEtMDEnKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLkRhdGUoJzIwMDAtMTItMzEnKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PSJkYXkiKSwgdGFibGVfcm93cykNCiAgICAgICAgICAgICAgICAgICAgICksDQogIEludm9pY2VDdXJyZW5jeSA9IHJlcCgiQ1UiLHRhYmxlX3Jvd3MpLA0KICBJbnZvaWNlQW10ID0gcm91bmQocnVuaWYodGFibGVfcm93cywgbWluID0gMTAwLCBtYXggPSAxMDAwKSwyKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEYpDQoNCiMgRGlzcGxheSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgZGF0YS5mcmFtZQ0KaGVhZCh0YmxfMSkNCmBgYA0KTm93IGxldCdzIGNvbnZlcnQgdGhhdCB0YWJsZSB0byBYTUwgZm9ybWF0OiAgDQpgYGB7ciBleGFtcGxlXzFfbWFrZV94bWwsIHJlc3VsdHM9J2hvbGQnfQ0KIyBUaGlzIGNvZGUgY29udmVydHMgdGhlIGludm9pY2VzIHRhYmxlIHRvIGFuIFhNTCBkb2N1bWVudCANCiMgYW5kIHNhdmVzIGl0IHRvIGZpbGUNCg0KIyBDcmVhdGUgeG1sIHJvb3QgZWxlbWVudA0KeG1sX3Jvb3QgPC0geG1sMjo6eG1sX25ld19yb290KCd0YWJsZScpDQoNCiMgQXR0YWNoIGVhY2ggcm93IG9mIHRoZSB0YWJsZSBhcyBhbiA8aW52b2ljZT4gZWxlbWVudA0KZm9yKHIgaW4gYXNwbGl0KHRibF8xLDEpKSB7DQogIG5kIDwtIHhtbDI6OnhtbF9hZGRfY2hpbGQoeG1sX3Jvb3QsICdpbnZvaWNlJykNCiAgZm9yKHJfbiBpbiBuYW1lcyhyKSl7DQogICAgeG1sMjo6eG1sX2FkZF9jaGlsZCgueD1uZCwgLnZhbHVlID0gcl9uLCByW1tyX25dXSApDQogIH0NCn0NCg0KIyBXcml0ZSB0aGUgeG1sIGRvY3VtZW50IHRvIGZpbGUNCnhtbF9vdXRfdGJsXzEgPC0gaGVyZTo6aGVyZSgneG1sX2ZpbGVzJywneG1sX291dC54bWwnKQ0KaW52aXNpYmxlKHhtbDI6OndyaXRlX3htbCh4bWxfcm9vdCwgeG1sX291dF90YmxfMSkpDQpgYGANCg0KVGhlIHJlc3VsdGluZyBYTUwgZmlsZSBsb29rcyBsaWtlIHRoaXM6ICANCmBgYHtyIGV4YW1wbGVfMV9zaG93X3htbCwgZWNobz1GQUxTRX0NCiMgcmVhZCBhbmQgZGlzcGxheSB0aGUgeG1sIGZpbGUNCm91dHB1dCA8LSBmbl9Db2RlQ2h1bmtPdXQobGFuZyA9ICJYTUwiLCBGaWxlID0geG1sX291dF90YmxfMSkNCm91dHB1dA0KYGBgDQoNCg0KRXhhbWluaW5nIHRoZSByZXN1bHRpbmcgWE1MIGZpbGUsIGVhY2ggYDxpbnZvaWNlPmAgZWxlbWVudCBoYXMgNSBjaGlsZCBlbGVtZW50cyByZXByZXNlbnRpbmcgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBpbnZvaWNlLCB3aXRoIGVhY2ggb2YgdGhvc2UgY2hpbGQgZWxlbWVudHMgc3RvcmluZyB0aGUgaW5mb3JtYXRpb24gYXMgaXRzIHZhbHVlLiBOb3cgaWYgdGhlIGZvY3VzIG9mIHRoaXMgdGFibGUvcmVwb3J0IGlzIG9uIHRoZSBpbnZvaWNlIGFtb3VudCBgaW52b2ljZUFtdGAsIHRoZW4gaXQgbWlnaHQgYmUgYmV0dGVyIHRvIGhhdmUgdGhlIGludm9pY2UgYW1vdW50IGluZm9ybWF0aW9uIGFzIHRoZSBvbmx5IHZhbHVlLCBhbmQgZXZlcnl0aGluZyBlbHNlIG1pZ2h0IGJlIGJldHRlciByZXByZXNlbnRlZCBhcyBhbiBhdHRyaWJ1dGUuIEF0dHJpYnV0ZXMgdXN1YWxseSBnaXZlIGFkZGl0aW9uYWwgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZWxlbWVudCBhbmQgaXRzIHZhbHVlLCB3ZSBtYXkgY2FsbCB0aG9zZSBhdHRyaWJ1dGVzIGFzcGVjdHMgb3IgZXZlbiBkaW1lbnNpb25zLiBTbyBsZXQncyB0cnkgdG8gcmV3cml0ZSB0aGUgWE1MIGluIGEgZGlmZmVyZW50IHdheSB0byByZWZsZWN0IHRoaXM6DQpgYGB7ciBleGFtcGxlXzJfbWFrZV94bWwsIHJlc3VsdHM9J2hvbGQnfQ0KIyBSZS13cml0ZSB0aGUgeG1sIGZpbGUgd2l0aCBhdHRyaWJ1dGVzDQoNCiMgY3JlYXRlIHJvb3QgZWxlbWVudCBmb3IgdGhlIG5ldyBYTUwNCnhtbF9yb290XzIgPC0geG1sMjo6eG1sX25ld19yb290KCd0YWJsZScpDQoNCiMgZGVmaW5lIGNoaWxkcmVuIHdpdGggYXR0cmlidXRlcw0KZm9yKHIgaW4gYXNwbGl0KHRibF8xLDEpKSB7DQogIG5kIDwtIHhtbDI6OnhtbF9hZGRfY2hpbGQoeG1sX3Jvb3RfMiwgJ2ludm9pY2UnLCByW1tsZW5ndGgocildXSkNCiAgZm9yKHJfbiBpbiBuYW1lcyhyKSl7DQogICAgeG1sMjo6eG1sX2F0dHJzKG5kKSA8LSByWy1sZW5ndGgocildDQogIH0NCn0NCg0KIyBXcml0ZSB0aGUgeG1sIGRvY3VtZW50IHRvIGZpbGUNCnhtbF9vdXRfdGJsXzIgPC0gaGVyZTo6aGVyZSgneG1sX2ZpbGVzJywneG1sX291dF8yLnhtbCcpDQppbnZpc2libGUoeG1sMjo6d3JpdGVfeG1sKHhtbF9yb290XzIsIHhtbF9vdXRfdGJsXzIpKQ0KYGBgDQoNClRoZSByZXN1bHRpbmcgTmV3IFhNTCBmaWxlIGxvb2tzIGxpa2UgdGhpczogIA0KYGBge3IgZXhhbXBsZV8yX3Nob3dfeG1sLCBlY2hvPUZBTFNFfQ0KIyByZWFkIGFuZCBkaXNwbGF5IHRoZSB4bWwgZmlsZQ0Kb3V0cHV0XzIgPC0gZm5fQ29kZUNodW5rT3V0KGxhbmcgPSAiWE1MIiwgRmlsZSA9IHhtbF9vdXRfdGJsXzIpDQpvdXRwdXRfMg0KYGBgDQoNCk5vdyB0aGF0IHdlIGhhdmUgbW9kZWxlZCBvdXIgaW5mb3JtYXRpb24gaW4gYW4gYWNjZXB0YWJsZSBmb3JtLCB3ZSBjYW4gdHJ5IHRvIHJlLWNvbnN0cnVjdCB0aGUgdGFibGUgZnJvbSB0aGUgWE1MLCBoZXJlIEkgYW0gdXNpbmcgUnNjcmlwdCBgeG1sMmAgbGlicmFyeSB0byBkbyB0aGF0LCBidXQgaXQgY2FuIGJlIGRvbmUgb24gYW55IHN5c3RlbSB0aGF0IGlzIGNhcGFibGUgb2YgcGFyc2luZyBYTUwgZmlsZXM6DQpgYGB7ciBleGFtcGxlXzJfbWFrZV90YmwsIHJlc3VsdHM9J2hvbGQnfQ0KIyBSZWFkIHhtbCBmaWxlDQp4bWxfdGJsIDwtIHhtbDI6OnJlYWRfeG1sKHhtbF9vdXRfdGJsXzIpDQoNCiMgZmluZCBhbGwgaW52b2ljZSBlbGVtZW50cw0KaW52b2ljZXMgPC0geG1sMjo6eG1sX2ZpbmRfYWxsKHhtbF90YmwsICcuLy9pbnZvaWNlJykNCnZhbHVlcyA8LSB4bWwyOjp4bWxfZmluZF9hbGwoeG1sX3RibCwgJy4vL2ludm9pY2UvdGV4dCgpJykgJT4lIHhtbDI6OmFzX2xpc3QoKSAlPiUgdW5saXN0KCkNCg0KIyBleHRyYWN0IGludm9pY2UgYXR0cmlidXRlcyBhbmQgdmFsdWVzIGZyb20gYWxsIGVsZW1lbnRzIGFuZCBjb252ZXJ0IHRvIGEgZGF0YWZyYW1lDQp4bWxfdG9fdGJsIDwtIHhtbDI6OnhtbF9hdHRycyhpbnZvaWNlcykgJT4lIGJpbmRfcm93cygpICU+JSANCiAgbXV0YXRlKEludm9pY2VBbXQ9IGFzLmRvdWJsZSh2YWx1ZXMpKSAlPiUgYXMuZGF0YS5mcmFtZSgpDQojIENvcnJlY3QgZGF0YSB0eXBlcw0KeG1sX3RvX3RibCRJbnZvaWNlTnVtIDwtIGFzLmludGVnZXIoeG1sX3RvX3RibCRJbnZvaWNlTnVtKQ0KeG1sX3RvX3RibCRJbnZvaWNlRGF0ZSA8LSBhcy5EYXRlKHhtbF90b190YmwkSW52b2ljZURhdGUpDQpoZWFkKHhtbF90b190YmwpDQojIENvbXBhcmUgcmVzdWx0IG9mIGNvbnZlcnNpb24gdG8gb3JpZ2luYWwgdGFibGUNCnBhc3RlKCJNYXRjaGVzIE9yaWdpbmFsOiAiLCBhbGxfZXF1YWwoeG1sX3RvX3RibCwgdGJsXzEpKSAjIFNob3VsZCByZXR1cm4gVFJVRQ0KDQpgYGANCg0KIyMjIFhNTCBTY2hlbWEsIE5hbWVzcGFjZXMgYW5kIFZhbGlkYXRpb24gIA0KQXMgbWVudGlvbmVkLCBYTUwgaXMgdXNlZCB0byB0cmFuc3BvcnQgaW5mb3JtYXRpb24gYmV0d2VlbiBzeXN0ZW1zLCBhbmQgdGhhdCBhbiBYTUwgZG9jdW1lbnQgaXMgY3JlYXRlZCwgdGhlIG5leHQgc3RlcCB3aWxsIGJlIHRvIHNlbmQgdG8gdGhlIGRlc3RpbmF0aW9uIHN5c3RlbS4gQnV0IGFuIGltcG9ydGFudCBxdWVzdGlvbiBhcmlzZXMsIGhvdyBkbyB3ZSBtYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24vcmVjZWl2aW5nIHN5c3RlbSBpcyBhYmxlIHRvIGhhbmRsZSBhbmQgdmVyaWZ5IHRoZSBpbmZvcm1hdGlvbiBpbiBvdXIgZG9jdW1lbnQgY29ycmVjdGx5PyBGb3IgZXhhbXBsZSwgdGhlIHJvb3QgZWxlbWVudCBpbiB0aGUgZXhhbXBsZSBkb2N1bWVudCBpcyBjYWxsZWQgYHRhYmxlYCwgd2hhdCBzaG91bGQgYmUgZXhwZWN0ZWQgdG8gYmUgaW5jbHVkZWQgaW4gYSB0YWJsZSBlbGVtZW50PyBJcyBpdCBhIHRhYmxlIG9mIGludm9pY2VzLCBvciBpcyBpdCBhIHRhYmxlIGEgcGllY2Ugb2YgZnVybml0dXJlPyAgDQoNClRvIGFkZHJlc3MgdGhlIGFib3ZlIHF1ZXN0aW9ucywgWE1MIGhhcyBtZWNoYW5pc21zIHdoZXJlYnkgZWxlbWVudHMgaW4gYW4gWE1MIGRvY3VtZW50IGNhbiBiZSBkZXNjcmliZWQgYW5kIHZlcmlmaWVkLCB0aGVzZSBpcyBtZWNoYW5pc21zIG1haW5seSBkZXBlbmQgb24gX19zY2hlbWFfXyBhbmQgX19uYW1lc3BhY2VzX18uICANCg0KX19TY2hlbWFfXyBJcyBhIGNvbXBvbmVudCBvZiBYTUwgKFtXM0MgcmVjb21tZW5kYXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy9YTUwvU2NoZW1hKSkgdXNlZCB0byBkZXNjcmliZSBhbmQgdmFsaWRhdGUgZWxlbWVudHMgaW4gYW4gWE1MIGRvY3VtZW50LiBTY2hlbWEgY2FuIGJlIGRlc2NyaWJlZCBhcyB0aGUgYmx1ZXByaW50IG9mIHZvY2FidWxhcnkgdXNlZCwgd2hhdCBhbmQgaG93IGRhdGEgaXMgc3RvcmVkIGluIGFuIFhNTCBmaWxlLCB0aGVyZSBhcmUgZGlmZmVyZW50IHNjaGVtYSBsYW5ndWFnZXMgc3VjaCBhcyBEb2N1bWVudCBUeXBlIERlZmluaXRpb25zIChEVERzKSwgUmVsYXgtTkcsIFNjaGVtYXRyb24gYW5kIFczQyBYU0QgKFhNTCBTY2hlbWEgRGVmaW5pdGlvbnMpLiBUaGUgZm9jdXMgd2lsbCBiZSBvbiBYU0QgYXMgdGhpcyBpcyB0aGUgU2NoZW1hIGxhbmd1YWdlIHVzZWQgaW4gWEJSTC4gIA0KDQpfX05hbWVzcGFjZXNfXyBJcyBhIGNvbXBvbmVudCBvZiBYTUwgKFtXM0MgcmVjb21tZW5kYXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy9UUi94bWwtbmFtZXMvKSkgdXNlZCBmb3IgcHJvdmlkaW5nIHVuaXF1ZWx5IG5hbWVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIGFuIFhNTCBkb2N1bWVudC4gWE1MIGRvY3VtZW50IG1heSBjb250YWluIGVsZW1lbnRzIGZyb20gbXVsdGlwbGUgdm9jYWJ1bGFyaWVzIChzY2hlbWEpLCBuYW1lc3BhY2VzIGhlbHAgaW4gdW5pcXVlbHkgaWRlbnRpZnlpbmcgZWxlbWVudHMgZnJvbSBkaWZmZXJlbnQgdm9jYWJ1bGFyaWVzIGhhdmluZyBpZGVudGljYWwgbmFtZXMuIEEgbmFtZXNwYWNlIHRha2VzIHRoZSBmb3JtIG9mIGEgVVJJLCBmb3IgZXhhbXBsZSBgaHR0cDovL215bmFtZXNwYWNlLmNvbS8xLzFgLiBBIG5hbWVzcGFjZSBwcmVmaXggY2FuIGJlIGRlY2xhcmVkIGluIGFuIFhNTCBkb2N1bWVudCB0byByZWZlciB0byBzcGVjaWZpYyBuYW1lc3BhY2UgdXNpbmcgYHhtbG5zYCBhdHRyaWJ1dGUsIGZvciBleGFtcGxlICBgeG1sbnM6bXlucz1odHRwOi8vbXluYW1lc3BhY2UuY29tLzEvMWAuICAgIA0KDQoNCkZvbGxvd2luZyB3aXRoIHRoZSBpbnZvaWNlcyB0YWJsZSBleGFtcGxlLCBhIHNjaGVtYSB3YXMgY3JlYXRlZCBmb3IgdGhpcyByZXBvcnQgKHVzaW5nIGFueSBzY2hlbWEgY3JlYXRpb24gc29mdHdhcmUpLCB0aGUgc2NoZW1hIGluc3VyZXMgdGhlIGZvbGxvd2luZzogIA0KDQoqIE5hbWVzcGFjZSBgaHR0cDovL215cHJvamVjdC5jb20vdGVzdDIvMWAgd2FzIGdpdmVuIHRvIHJlZmVyIHRvIHRoZSB2b2NhYnVsYXJ5IG9mIHRoZSBzY2hlbWEgIA0KKiBUaGUgcm9vdCBlbGVtZW50IGlzIGNhbGxlZCBgdGFibGVgIGFuZCBjb250YWlucyBvbmUgb3IgbW9yZSBgaW52b2ljZWAgZWxlbWVudCAgDQoqIEVhY2ggaW52b2ljZSBlbGVtZW50IGlzIHJlcXVpcmVkIHRvIGhhdmUgYSBzcGVjaWZpYyBzZXQgb2YgYXR0cmlidXRlcyBhcyBmb2xsb3dzOiAgDQogICsgYEludm9pY2VOdW1gIG9mIGRhdGEgdHlwZSBwb3NpdGl2ZSBpbnRlZ2VyDQogICsgYEludm9pY2VEYXRlYCBvZiBkYXRhIHR5cGUgZGF0ZSAgDQogICsgYEludm9pY2VDdXJyZW5jeWAgYSBzdHJpbmcgdGhhdCBjYW4gYmUgZWl0aGVyICJDVSIgb3IgIkNYIiAgDQogICsgYEN1c3RvbWVyTmFtZWAgb2YgZGF0YSB0eXBlIHN0cmluZw0KICArIEZpbmFsbHkgaW52b2ljZSB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIDAgIA0KICANClNjaGVtYSBmaWxlIGlzIGFzIGZvbGxvd3M6DQpgYGB7ciBkaXNibGF5X3NjaGVtYV9maWxlLCBlY2hvPUZBTFNFfQ0KZm5fQ29kZUNodW5rT3V0KGxhbmc9J1hNTCcsIEZpbGU9aGVyZTo6aGVyZSgneG1sX2ZpbGVzJywgJ2V4YW1wbGVfMl9zY2hlbWEyLnhzZCcpKQ0KYGBgDQoNCk5vdyB3ZSBuZWVkIHRvIGNoYW5nZSBvdXIgWE1MIGZpbGUgdG8gcmVmZXJlbmNlIHRoZSBzY2hlbWEsIHRoYXQgaXMgZG9uZSB1c2luZyB0aGUgYHhtbG5zYCBhdHRyaWJ1dGUgYW5kIGdpdmluZyBpdCBhIG5hbWVzcGFjZSBwcmVmaXggb2YgJ2ludicsIGFuZCBwcm92aWRpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEgZmlsZSB1c2luZyBgeHM6c2NoZW1hTG9jYXRpb25gIGF0dHJpYnV0ZSwgbm90IHRoYXQgdGhlIGxhdGVyIGF0dHJpYnV0ZSBpcyBmcm9tIGB4cz1odHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZWAgbmFtZXNwYWNlLiBUaGUgbmV3IGZpbGUgd2l0aCB0aGUgc2NoZW1hIHJlZmVyZW5jZSBpcyBuYW1lZCBgeG1sX291dF8yX3NjaGVtYS54bWxgIGFuZCBhbmQgdGhlIHJlbGV2YW50IHBhcnQgb2YgaXQgbG9va3MgYXMgZm9sbG93czogIA0KDQpgYGB4bWwNCjxpbnY6dGFibGUgeG1sbnM6aW52PSJodHRwOi8vbXlwcm9qZWN0LmNvbS90ZXN0Mi8xIiANCgl4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIA0KCXhzOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbXlwcm9qZWN0LmNvbS90ZXN0Mi8xIGV4YW1wbGVfMl9zY2hlbWEyLnhzZCI+DQpgYGANCioqVmFsaWRhdGlvbiB3aXRoIG5vIGVycm9ycyoqDQpCZWZvcmUgcHJvY2Vzc2luZyB0aGUgWE1MIGZpbGUsIHRoZSByZWNlaXZpbmcgY29tcHV0ZXIgd2lsbCBhbHdheXMgdmFsaWRhdGUgdGhlIFhNTCBmaWxlIGFnYWluc3QgdGhlIHJlZmVyZW5jZWQgc2NoZW1hLCB3ZSBjYW4gZG8gdGhhdCBoZXJlIHVzaW5nIFJzY3JpcHQgYHhtbDI6OnhtbF92YWxpZGF0ZSgpYCBmdW5jdGlvbiBhcyBmb2xsb3dzOiAgDQpgYGB7ciB0ZXN0XzJfdmFsaWRhdGVfMCwgIHJlc3VsdHM9J2hvbGQnfQ0KIyBSZWFkIFhNTCBpbnN0YW5jZSBhbmQgc2NoZW1hDQppbnN0IDwtIHhtbDI6OnJlYWRfeG1sKGhlcmU6OmhlcmUoInhtbF9maWxlcyIsInhtbF9vdXRfMl9zY2hlbWEueG1sIikpDQpzY2hlbWEgPC0geG1sMjo6cmVhZF94bWwoaGVyZTo6aGVyZSgieG1sX2ZpbGVzIiwiZXhhbXBsZV8yX3NjaGVtYTIueHNkIikpDQoNCiMgVmFsaWRhdGUgWE1MIGluc3RhbmNlIGFnYWluc3QgdGhlIHNjaGVtYQ0KeG1sMjo6eG1sX3ZhbGlkYXRlKGluc3Qsc2NoZW1hKQ0KYGBgDQpWYWxpZGF0aW5nIHRoZSBmaXJzdCBmaWxlIHJldHVybnMgYFRSVUVgIHdpdGggMCBlcnJvcnMsIG1lYW5pbmcgdGhhdCB0aGUgZmlsZSBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYS4gDQoNCioqVmFsaWRhdGlvbiB3aXRoIEVycm9ycyoqICANCk5vdyBsZXQncyBjaGFuZ2UgdGhlIGZpbGUgYW5kIHRlc3QgaWYgdGhlIHZhbGlkYXRpb24gd2lsbCBkZXRlY3QgdGhlIGVycm9ycy4gV2UgY3JlYXRlIGEgbmV3IGZpbGUgY2FsbGVkIGB4bWxfb3V0XzJfc2NoZW1hX2Vycm9ycy54bWxgLCBhbmQgd2UgY2hhbmdlIGl0IHRvIGFzIGZvbGxvd3M6ICANCg0KMS4gRm9yIHRoZSBmaXJzdCBpbnZvaWNlIHJlbW92ZSBgQ3VzdG9tZXJOYW1lYCBhdHRyaWJ1dGUgIC0+IHRlc3QgbWlzc2luZyBhdHRyaWJ1dGVzIGFyZSBkZXRlY3RlZA0KMi4gRm9yIHRoZSBzZWNvbmQgaW52b2ljZSBjaGFuZ2UgYEludm9pY2VOdW1gIHZhbHVlIHRvIHN0cmluZyBgaXhgLT4gdGVzdCBpbmNvbnNpc3RlbnQgYXR0cmlidXRlIGRhdGF0eXBlIGlzIGRldGVjdGVkICANCjMuIEZvciB0aGUgdGhpcmQgaW52b2ljZSBjaGFuZ2UgYEludm9pY2VDdXJyZW5jeWAgdmFsdWUgdG8gYFhaYCAtPiB0ZXN0IG9ubHkgdmFsaWQgY3VycmVuY3kgY2hvaWNlcyBhcmUgYWxsb3dlZCAgDQo0LiBpbiB0aGUgZm91cnRoIGludm9pY2UgY2hhbmdlIHRoZSB2YWx1ZSBmcm9tIGAxMzMuNjlgIHRvIGAtMTMzLjY5YCAtPiB0ZXN0IGlmIG9ubHkgcG9zaXRpdmUgaW52b2ljZSBhbW91bnQgdmFsdWVzIGFyZSBhbGxvd2VkLiAgDQoNClRoZW4gd2UgcnVuIHRoZSB2YWxpZGF0aW9uIGFnYWluIG9uIHRoZSBtb2RpZmllZCBmaWxlLCB3ZSBzaG91bGQgZ2V0IGFuIGVycm9yIHRoaXMgdGltZTogIA0KYGBge3IgdGVzdF8yX3ZhbGlkYXRlXzEsICByZXN1bHRzPSdob2xkJ30NCiMgUmVhZCBYTUwgaW5zdGFuY2UgYW5kIHNjaGVtYSIsDQppbnN0X2VyciA8LSB4bWwyOjpyZWFkX3htbChoZXJlOjpoZXJlKCJ4bWxfZmlsZXMiLCJ4bWxfb3V0XzJfc2NoZW1hX2Vycm9ycy54bWwiKSkNCnNjaGVtYSA8LSB4bWwyOjpyZWFkX3htbChoZXJlOjpoZXJlKCJ4bWxfZmlsZXMiLCJleGFtcGxlXzJfc2NoZW1hMi54c2QiKSkNCg0KIyBWYWxpZGF0ZSBYTUwgaW5zdGFuY2UgYWdhaW5zdCB0aGUgc2NoZW1hDQp4bWwyOjp4bWxfdmFsaWRhdGUoaW5zdF9lcnIsc2NoZW1hKQ0KDQpgYGANCkFzIHNob3duIGFib3ZlLCBhIHNpbXBsZSBYTUwgdmFsaWRhdG9yICh4bWwyKSBkZXRlY3RlZCBhbGwgdGhlIGVycm9ycyBhbmQgcmVwb3J0ZWQgdGhlbS4gIA0KDQojIyMgWExpbmsgYW5kIFhQb2ludGVyICANCkFub3RoZXIgY29tcG9uZW50IHRoYXQgWE1MIHByb3ZpZGVzIGlzIFhMaW5rIGFuZCBYUG9pbnRlciwgdGhlc2UgY29tcG9uZW50cyBjYW4gYmUgdXNlZCB0byBsaW5rIG90aGVyIGNvbXBvbmVudHMgd2l0aGluIFhNTCBvciBsaW5rIHRvIGV4dGVybmFsIHJlc291cmNlcy4gIA0KDQpfX1hMaW5rX18gaXMgYSBbVzNDIHJlY29tbWVuZGF0aW9uXShodHRwczovL3d3dy53My5vcmcvVFIveGxpbmsxMS8pIHNvbWUgd2hhdCBsaWtlIGh5cGVybGluayBpbiBIVE1MOiANCg0KPiBYTUwgTGlua2luZyBMYW5ndWFnZSAoWExpbmspIFZlcnNpb24gMS4xLCB3aGljaCBhbGxvd3MgZWxlbWVudHMgdG8gYmUgaW5zZXJ0ZWQgaW50byBYTUwgZG9jdW1lbnRzIGluIG9yZGVyIHRvIGNyZWF0ZSBhbmQgZGVzY3JpYmUgbGlua3MgYmV0d2VlbiByZXNvdXJjZXMuIEl0IHVzZXMgWE1MIHN5bnRheCB0byBjcmVhdGUgc3RydWN0dXJlcyB0aGF0IGNhbiBkZXNjcmliZSBsaW5rcyBzaW1pbGFyIHRvIHRoZSBzaW1wbGUgdW5pZGlyZWN0aW9uYWwgaHlwZXJsaW5rcyBvZiB0b2RheSdzIEhUTUwsIGFzIHdlbGwgYXMgbW9yZSBzb3BoaXN0aWNhdGVkIGxpbmtzLiBgciB0dWZ0ZTo6cXVvdGVfZm9vdGVyKCctLS0gW1czLm9yZyBYTGluayByZWNvbW1lbmRhdGlvbl0oaHR0cHM6Ly93d3cudzMub3JnL1RSL3hsaW5rMTEvI2Fic3RyYWN0KScpYCAgDQoNCl9fWFBvaW50ZXJfXyBpcyBhIFtXM0MgcmVjb21tZW5kYXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy9UUi94cHRyLykgaXMgYSBjb250c3RydWN0IHRoYXQgYWxsb3dzIGZvciBhbGxvY2F0aW5nIHNwZWNpZmljIGZyYWdtZW50IHdpdGhpbiBYTUwuICANCg0KSXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgaW4gbWluZCB0aGF0IFhNTCBhbmQgaXRzIGNvbXBvbmVudHMgYXJlIGp1c3QgaW5zdHJ1Y3Rpb25zLCB0aGV5IGRvIG5vdGhpbmcgb3RoZXIgdGhhbiB0cmFuc3BvcnRpbmcgaW5mb3JtYXRpb24uIEZvciB0aGUgWExpbmsgYW5kIFhQb2ludGVyIGNvbXBvbmVudHMgdG8gaGF2ZSBhbiBlZmZlY3QsIGl0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBieSBhbiBYTUwgcHJvY2Vzc29yLg0KDQoqKlhMaW5rIGFuZCBYUG9pbnRlciBFeGFtcGxlKiogIA0KVGhlcmUgaXMgbm8gYnJvd3NlciBzdXBwb3J0IGZvciBYTUwgWExpbmssIGJ1dCB0aGUgYmVzdCB3YXkgdG8gc2ltdWxhdGUgaXQgYW5kIHVuZGVyc3RhbmQgdGhlIGlkZWEgb2YgWExpbmsgYW5kIFhQb2ludGVyIGlzIHRvIHVzZSBoeXBlcmxpbmtzLCAgQ2xpY2sgdGhpcyBsaW5rOiBbaHR0cHM6Ly93d3cudzMub3JnL1RSL3hsaW5rMTEvI2Fic3RyYWN0XShodHRwczovL3d3dy53My5vcmcvVFIveGxpbmsxMS8jYWJzdHJhY3Qpe3RhcmdldD1fYmxhbmt9ICANCg0KV2Ugc2hvdWxkIGJlIHRha2VuIHRvIHRoZSBYTGluayByZWNvbW1lbmRhdGlvbiBvbiB0aGUgVzNDIHdlYnNpdGUgYXQgdGhlIGxvY2F0aW9uIG9mIGBBYnN0cmFjdGAsIHdoYXQgaGFwcGVuZWQgaGVyZSBpcyB0aGF0IHRoZSBicm93c2VyIHJlY29nbml6ZWQgdGhlIGh5cGVybGluayAoWExpbmspIGFuZCB0aGVuIHRoZSBsb2NhdG9yIGdpdmVuIGFmdGVyIHRoZSBgI2Agc3ltYm9sIChYUG9pbnRlcikgYW5kIGV4ZWN1dGVkIHRoZSBpbnN0cnVjdGlvbnMsIGFuZCBpbiB0aGlzIGNhc2UgdGhlIGluc3RydWN0aW9ucyB3YXMgdG8gb3BlbiB0aGUgd2Vic2l0ZSBhdCB0aGUgc3BlY2lmaWNlZCBsb2NhdGlvbiwgc28gd2Ugd2VyZSBhYmxlIHRvIGxpbmsgZm9ybSB0aGlzIHBhZ2UgdG8gYW5vdGhlciBleHRlcm5hbCBwYWdlLiBJbiBYTUwgWExpbmsgd29ya3MgdGhlIHNhbWUgd2F5LCBpdCBsaW5rcyBlbGVtZW50cyB0byBvdGhlciBlbGVtZW50cywgb3IgZXh0ZXJuYWwgcmVzb3VyY2VzIHdpdGggc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIGFuZCB0eXBlcyBvZiBsaW5rcyB1c2VkLg0KDQpYQlJMIHVzZXMgWExpbmtzIGV4dGVuc2l2ZWx5IHRvIGxpbmsgaXRzIGNvbXBvbmVudHMsIGFuZCB3ZSB3aWxsIGdvIGludG8gdGhpcyBpbiBkZXRhaWxzIGxhdGVyLCBmb3Igbm93IGxldCdzIGp1c3QgYmUgZmFtaWxpYXIgd2l0aCB0aGUgY29uY2VwdCBvZiBYTGluayBhbmQgWFBvaW50ZXIuDQoNCg0KIyMjIENvbmNsdXNpb24gIA0KWE1MIGFzIGxhbmd1YWdlIGFuZCBzdGFuZGFyZHMgdGhhdCBwcm92aWRlcyBmb3I6ICANCiogRmxleGliaWxpdHkgaW4gZGF0YSBtb2RlbGluZyAgDQoqIE1lY2hhbmlzbXMgZm9yIGNyZWF0aW5nIHZvY2FidWxhcmllcyAoZGljdGlvbmFyaWVzKSAgDQoqIE1lY2hhbmlzbXMgdG8gdmFsaWRhdGUgWE1MIGNvbnRlbnQgIA0KKiBNZWNoYW5pc21zIHRvIGxpbmsgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGNvbXBvbmVudHMNCg0KSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlLCBYTUwgaXMgYSBzdGFibGUgYW5kIHdpZGVseSB1c2VkIGxhbmd1YWdlLCBhbmQgYWxsIHRoYXQgbWFkZSBYTUwgc3VpdGFibGUgZm9yIHRoZQ0Kb2JqZWN0aXZlcyBvZiBYQlJMLiAgDQoNCg0KIyMgSG93IERvZXMgWEJSTCBSZXByZXNlbnQgRGF0YSAgDQoNCk5vdyB0aGF0IHdlIGFyZSBmYW1pbGlhciB3aXRoIFhNTCwgd2UgY2FuIGdldCBpbnRvIHRoZSBtZWNoYW5pc21zIG9mIGhvdyBYQlJMIHJlcHJlc2VudCBkYXRhLiBJbiB0aGlzIHNlY3Rpb24gd2UgZmlyc3QgaGF2ZSBhbiBvdmVydmlldyBvZiB0aGUgY29tcG9uZW50cyBhbmQgc3BlY2lmaWNhdGlvbnMgb2YgWEJSTCwgc29tZSBiYXNpYyBjb25jZXB0cyBvZiBob3cgWEJSTCByZXByZXNlbnRzIGRhdGEsIGZpbmFsbHkgd2UgbG9vayBhdCByZWFsIGxpZmUgWEJSTCBleGFtcGxlcy4gIA0KDQojIyMgWEJSTCBDb21wb25lbnRzICANClRoZSBmaWd1cmUgYmVsb3cgdHJpZXMgdG8gdmlzdWFsaXplIHRoZSBpbmdyZWRpZW50cyBuZWVkZWQgdG8gZW5kIHVwIHdpdGggWEJSTCByZXBvcnQgKHN0cnVjdHVyZWQgZmluYW5jaWFsIHJlcG9ydCk6ICANCg0KMS4gQXQgdGhlIGJhc2UsIHdlIGhhdmUgKipYTUwqKiwgdGhlIGZvdW5kYXRpb24gZXZlcnl0aGluZyBlbHNlLiAgDQoyLiBBcyBtZW50aW9uZWQsIFsqKlhCUkwgc3BlY2lmaWNhdGlvbnMqKl0oI3hicmwtc3BlY3MpIGFyZSBiYXNlZCBvbiBYTUwsIGFuZCB0aGVzZSBzcGVjaWZpY2F0aW9ucyBhcmUgdG9vbHMgdG8gYnVpbGQgYSByZXBvcnRpbmcgc3lzdGVtIGJhc2VkIG9uIFhCUkwuICANCjMuICoqWEJSTCBUYXhvbm9teSoqIGlzIHRoZSBtb3N0IGNyaXRpY2FsIGluZ3JlZGllbnQsIGl0IHVzZXMgWEJSTCBzcGVjaWZpY2F0aW9ucyB0byBidWlsZCB0aGUgc3RydWN0dXJlIGFuZCB0aGUgZGF0YSBtb2RlbCBmb3IgWEJSTCByZXBvcnRpbmcsIHdlIGNhbiB0aGluayBvZiBhIFRheG9ub215IGFzIHRoZSBTY2hlbWEgZm9yIGEgcGFydGljdWxhciByZXBvcnRpbmcgZG9tYWluLiBYQlJMIFRheG9ub215IGNvbnNpc3RzIG9mOiAgDQogICAgKiBfX0RpY3Rpb25hcnkvVm9jYWJ1bGFyeV9fIG9mIGVsZW1lbnRzIHRvIGJlIHVzZWQgaW4gcmVwb3J0aW5nLCBpbiBYQlJMIHRlcm1pbm9sb2d5LCB0aGVzZSBhcmUgY2FsbGVkIF8iQ29uY2VwdHMiXy4gIA0KICAgICogX19UeXBlIERlZmluaXRpb25zX18gYXJlIGNvbXBvbmVudHMgb3IgZXh0ZW5zaW9uIG9mIGV4aXN0aW5nIGNvbXBvbmVudHMgdGhhdCBhcmUgdGhlIGJ1aWxkaW5nIGJsb2NrcyBvZiBDb25jZXB0cy4gIA0KICAgICogX19MaW5rYmFzZXNfXyBhcmUgZ3JvdXBzIG9mIFhsaW5rcyB0aGF0IGxpbmtzIGNvbmNlcHRzIHRvZ2V0aGVyIHRvIGZvcm0gYSBsb2dpY2FsIHN0cnVjdHVyZSBzdWNoIGFzIF9QcmVzZW50YXRpb24gTGlua2Jhc2VfIHVzZWQgdG8gbGluayBjb25jZXB0IHRvZ2V0aGVyIGluIGZvcm0gdG8gZW5hYmxlIGNvcnJlY3QgaGllcmFyY2hpY2FsIHByZXNlbnRhdGlvbiBvZiB0aGVzZSBjb25jZXB0cyBpbiBhIHJlcG9ydCBvciBhbnkgZm9ybSBvZiByZW5kZXJpbmcuICANCiAgICAqIF9fT3RoZXIgSW1wb3J0ZWQgVGF4b25vbWllc19fIFhCUkwgdGF4b25vbWllcyBjYW4gaW1wb3J0IG90aGVyIHRheG9ub21pZXMgdG8gYmUgcGFydCBvZiB0aGUgYmFzZSB0YXhvbm9teSwgdGhpcyBtZWNoYW5pc20gYWxsb3dzIGZvciByZXVzaW5nIGV4aXN0aW5nIHRheG9ub21pZXMgcmF0aGVyIHRoYW4gcmVjcmVhdGluZyBzb21ldGhpbmcgdGhhdCBhbHJlYWR5IGV4aXRzLiBBbGwgdGF4b25vbWllcyBpbXBvcnRlZCBieSB0aGUgYmFzZSB0YXhvbm9teSBhbmQgYW55IG90aGVyIHRheG9ub21pZXMgdGhhdCBpbXBvcnRlZCB0YXhvbm9taWVzIGltcG9ydCBhbGwgdG9nZXRoZXIgYXJlIGNhbGxlZCAqKkRpc2NvdmVyYWJsZSBUYXhvbm9teSBTZXQgKERUUykqKi4gQW4gZXhhbXBsZSBmb3IgdGhhdCBpcyB0aGUgVVMtR0FBUCB0YXhvbm9teSB3aGljaCBpbXBvcnRzIFN0b2NrIEV4Y2hhbmdlIENvbW1pc3Npb24gKFNFQykgdGF4b25vbWllcy4gIA0KICAgICogX19FeHRlbnNpb25zX18gdG8gb3RoZXIgdGF4b25vbWllcyBtYXliZSBwYXJ0IG9mIHRoZSBiYXNlIHRheG9ub215LiAgDQogICAgKiBfX090aGVyIFJlc291cmNlc19fIHN1Y2ggYXMgZG9jdW1lbnRhdGlvbiBhbmQgcmVmZXJlbmNlcyBtYXkgYmUgaW5jbHVkZWQgaW4gYW4gWEJSTCBUYXhvbm9teS4gIA0KNC4gKipYQlJMIFJlcG9ydCoqIGNvbnNpc3RzIG9mOiAgDQogICAgDQogICAgKiBfU2NoZW1hXyBjb250YWluaW5nIGFueSBleHRlbnNpb24gdG8gdGhlIGJhc2UgdGF4b25vbXkgaWYgZXh0ZW5zaW9uIGlzIGFsbG93ZWQuICANCiAgICAqIF9MaW5rYmFzZXNfIHJlbGV2YW50IHRvIHRoZSByZXBvcnQuICANCiAgICAqIF9JbnN0YW5jZSBEb2N1bWVudF8gY29udGFpbmluZyB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IHJlcG9ydC4gIA0KNS4gKipDb25zdW1lciBEYXRhIE1vZGVsKiogaXMgd2hlcmUgdGhlIGRhdGEgdHJhbnNwb3J0ZWQgYnkgWEJSTCBlbmRzIHVwLCB0YXhvbm9taWVzIG11c3QgY29uc2lkZXIgY29uc3VtZXIgZGF0YSBuZWVkcyBpbiBpdHMgZGVzaWduLiANCiAgDQpgYGB7ciB4YnJsX2NvbXBvbmVudHMsIGVjaG89RkFMU0UsICB3YXJuaW5nPUZBTFNFLCBmaWcuY2FwPSdYQlJMIENvbXBvbmVudHMnfQ0KRGlhZ3JhbW1lUjo6Z3JWaXooIg0KDQpkaWdyYXBoIG1hdHJpeCB7DQoNCiAgZ3JhcGggW3NwbGluZXM9b3J0aG8sIHJhbmtkaXI9QlQsIGxhYmVsPSdYQlJMIENvbXBvbmVudHMnLCBub2Rlc2VwPTAuMDUsIHJhbmtzZXA9MC4wMiwgZm9udG5hbWU9SGVsdmV0aWNhXQ0KICANCiAgbm9kZSBbc2hhcGU9Ym94LCBzdHlsZT0nZmlsbGVkJywgY29sb3I9dHJhbnNwYXJlbnQsIGZpbGxjb2xvcj0nI2Y1ZjVmNScsIGZvbnRuYW1lPUhlbHZldGljYSwgZm9udGNvbG9yPScjMmMzZTUwJ10NCiAgDQogIGFbbGFiZWw9J1hNTCcsIHdpZHRoPTkuMywgZmlsbGNvbG9yPScjZDlkOWQ5J107IA0KICBiW2xhYmVsPSdYQlJMIFNwZWNpZmljYXRpb25zJywgd2lkdGg9OS4zLCBmaWxsY29sb3I9JyNkOWQ5ZDknXTsgDQogIGNbbGFiZWw9J2RpY3Rpb25hcnkvdm9jYWJ1bGFyeScsIHdpZHRoPTMsIGZpbGxjb2xvcj0nI2U2ZTZlNiddOyANCiAgZFtsYWJlbD0nTGlua2Jhc2VzJywgd2lkdGg9MywgZmlsbGNvbG9yPScjZTZlNmU2J107IA0KICBlW2xhYmVsPSdUeXBlIERlZmluaXRpb25zJywgd2lkdGg9MywgZmlsbGNvbG9yPScjZTZlNmU2J107IA0KICBmW2xhYmVsPSdFeHRlbnNpb25zJywgd2lkdGg9MywgZmlsbGNvbG9yPScjZTZlNmU2J107IA0KICBnW2xhYmVsPSdPdGhlciBJbXBvcnRlZCBUYXhvbm9taWVzJywgd2lkdGg9MywgZmlsbGNvbG9yPScjZTZlNmU2J107DQogIGhbbGFiZWw9J090aGVyIFJlc291cmNlcycsIHdpZHRoPTMsIGZpbGxjb2xvcj0nI2U2ZTZlNiddOw0KICBpW2xhYmVsPSdSZXBvcnQgU3BlY2lmaWMgVGF4b25vbXkgRXh0ZW5zaW9ucyBhbmQgTGlua2Jhc2VzIChpZiBhbGxvd2VkKScsIHdpZHRoPTkuMSwgZmlsbGNvbG9yPScjZjVmNWY1J10NCiAgaltsYWJlbD0nWEJSTCBJbnN0YW5jZSAoUmVwb3J0KScsIHdpZHRoPTkuMSwgZmlsbGNvbG9yPScjZjVmNWY1J10NCiAga1tsYWJlbD0nQ29uc3VtZXIgRGF0YSBNb2RlbChzKScsIGZpbGxjb2xvcj0nI2ZjZmNmYycsIHdpZHRoPTkuM10NCg0KICANCiAgZWRnZVtjb2xvcj0nIzI0MjQyNCcsIHBlbndpZHRoPTAuMl0NCiAgDQogIGEgLT4gYltzdHlsZT1pbnZpcywgYXJyb3doZWFkPW5vbmVdDQogIGIgLT4gZVtzdHlsZT1pbnZpcywgYXJyb3doZWFkPW5vbmVdDQogIHN1YmdyYXBoIGNsdXN0ZXIwIHsNCiAgICBncmFwaCBbcmFua2Rpcj1CVCwgbGFiZWw9J1hCUkwgVGF4b25vbXknLCBjb2xvciA9IGNyaW1zb25dOw0KICAgIHsgDQogICAgICAgIHJhbms9c2FtZTsNCiAgICAgICAgYyAtPiBlW3N0eWxlPWludmlzLCBhcnJvd2hlYWQ9bm9uZV0NCiAgICAgICAgYyAtPiBkW3N0eWxlPWludmlzLCBhcnJvd2hlYWQ9bm9uZV0NCiAgICB9DQogICAgew0KICAgICAgICByYW5rPXNhbWU7DQogICAgICAgIGcgLT4gaFtzdHlsZT1pbnZpcywgYXJyb3doZWFkPW5vbmVdDQogICAgICAgIGcgLT4gZltzdHlsZT1pbnZpcywgYXJyb3doZWFkPW5vbmVdDQogICAgfSANCiAgICBjIC0+IGdbc3R5bGU9aW52aXMsIGFycm93aGVhZD1ub25lXQ0KICB9DQogIHN1YmdyYXBoIGNsdXN0ZXIxIHsNCiAgICBncmFwaCBbcmFua2Rpcj1CVCwgbGFiZWw9J1hCUkwgUmVwb3J0IHBhY2thZ2UnLCBjb2xvciA9IGNyaW1zb25dOw0KICAgIGkgLT4galtzdHlsZT1pbnZpcywgYXJyb3doZWFkPW5vbmVdDQogIH0NCiAgaCAtPiBpW3N0eWxlPWludmlzLCBhcnJvd2hlYWQ9bm9uZV0NCiAgaiAtPiBrW3N0eWxlPWludmlzLCBhcnJvd2hlYWQ9bm9uZV0NCiAgDQoNCn0gICAgICAgICAgICAgICAgIA0KIiwgaGVpZ2h0PSIxMDAlIiwgd2lkdGg9IjEwMCUiKQ0KYGBgDQoNCg0KDQojIyMgWEJSTCBTcGVjaWZpY2F0aW9uc3sjeGJybC1zcGVjc30gIA0KQXMgZXhwbGFpbmVkIHByZXZpb3VzbHkgWEJSTCBpcyBhbiBleHRlbnNpb24gb2YgWE1MLCBiYXNpY2FsbHkgWEJSTCBpbnRlcm5hdGlvbmFsIHVzZWQgWE1MIHRvIGRlZmluZSBYQlJMIGNvbXBvbmVudHMgYW5kIGVsZW1lbnRzIHJlc3VsdGluZyBpbiBbWEJSTCBzcGVjaWZpY2F0aW9uc10oaHR0cHM6Ly9zcGVjaWZpY2F0aW9ucy54YnJsLm9yZy9zcGVjaWZpY2F0aW9ucy5odG1sKS4gIA0KQXMgb2YgZGF0ZSBvZiB0aGlzIGRvY3VtZW50LCB0aGUgcmVsZXZhbnQgY3VycmVudCBYQlJMIHNwZWNpZmljYXRpb25zIHJlY29tbWVuZGF0aW9ucyBhcmUgYXMgZm9sbG93czogDQoNCiogW1hCUkxdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlYy1ncm91cC1pbmRleC1ncm91cC1iYXNlLXNwZWMuaHRtbCl7dGFyZ2V0PV9ibGFua306IENvcmUgWEJSTCBTcGVjcy4gIA0KKiBbRGltZW5zaW9uc10oaHR0cHM6Ly9zcGVjaWZpY2F0aW9ucy54YnJsLm9yZy9zcGVjLWdyb3VwLWluZGV4LWdyb3VwLWRpbWVuc2lvbnMuaHRtbCl7dGFyZ2V0PV9ibGFua306IFRoZSBYQlJMIERpbWVuc2lvbnMgc3BlY2lmaWNhdGlvbiBlbmFibGVzIHRoZSByZXBvcnRpbmcgb2YgbXVsdGktZGltZW5zaW9uYWwgZmFjdHMgYWdhaW5zdCBkaW1lbnNpb25zIGRlZmluZWQgaW4gYW4gWEJSTCB0YXhvbm9teS4gIA0KKiBbRXh0ZW5zaWJsZSBFbnVtZXJhdGlvbnNdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlYy1ncm91cC1pbmRleC1leHRlbnNpYmxlLWVudW1lcmF0aW9ucy5odG1sKXt0YXJnZXQ9X2JsYW5rfTogQWxsb3dzIGZvciBjb25zdHJhaW5pbmcgdGhlIGFsbG93ZWQgdmFsdWVzIGZvciBwcmltYXJ5IHJlcG9ydGluZyBjb25jZXB0cyAoY2hvaWNlcyBmcm9tIHNwZWNpZmljIGxpc3QpLiAgDQoqIFtGb3JtdWxhXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3NwZWMtZ3JvdXAtaW5kZXgtZm9ybXVsYS5odG1sKXt0YXJnZXQ9X2JsYW5rfTogWEJSTCBGb3JtdWxhIHByb3ZpZGVzIGEgc3RhbmRhcmQgbWVjaGFuaXNtIGZvciBkZWZpbmluZyBydWxlcyBpbiBhIHRheG9ub215IHRoYXQgY2FuIGJlIGFwcGxpZWQgYWdhaW5zdCBpbnN0YW5jZSBkb2N1bWVudHMuICANCiogW0dlbmVyaWMgTGlua3NdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlYy1ncm91cC1pbmRleC1nZW5lcmljLWxpbmtzLmh0bWwpe3RhcmdldD1fYmxhbmt9OiBBIGxpbmsgdHlwZSB3aXRoIG5vIHByZWRlZmluZWQgc2VtYW50aWNzIG9yIGNvbnN0cmFpbnRzLiBUaGlzIGNhbiBiZSB1c2VkIHVzZWQgYXMgYSBidWlsZGluZyBibG9jayBmb3Igb3RoZXIgc3BlY2lmaWNhdGlvbnMuICANCiogW0dlbmVyaWMgUHJlZmVycmVkIExhYmVsXShodHRwczovL3NwZWNpZmljYXRpb25zLnhicmwub3JnL3NwZWMtZ3JvdXAtaW5kZXgtZ2VuZXJpYy1wcmVmZXJyZWQtbGFiZWwuaHRtbCl7dGFyZ2V0PV9ibGFua306IFRoaXMgc3BlY2lmaWNhdGlvbiBpbnRyb2R1Y2VzIHRoZSBwcmVmZXJyZWQgbGFiZWwgZmVhdHVyZSBmb3IgYWxsIHJlbGF0aW9uc2hpcHMuICAgIA0KKiBbR2xvYmFsIExlZGdlcl0oaHR0cHM6Ly9zcGVjaWZpY2F0aW9ucy54YnJsLm9yZy9zcGVjLWdyb3VwLWluZGV4LXhicmwtZ2wuaHRtbCl7dGFyZ2V0PV9ibGFua306IFhCUkwgU3BlY3MgZm9yIHRyYW5zYWN0aW9uYWwgcmVwb3J0aW5nLiAgDQoqIFtJbmZyYXN0cnVjdHVyZV0oaHR0cHM6Ly9zcGVjaWZpY2F0aW9ucy54YnJsLm9yZy9zcGVjLWdyb3VwLWluZGV4LWluZnJhc3RydWN0dXJlLmh0bWwpe3RhcmdldD1fYmxhbmt9OiBTcGVjaWZpY2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gYXJlIHVzZWQgdG8gc3VwcG9ydCB0aGUgZGV2ZWxvcG1lbnQgb2YgWEJSTCBzcGVjaWZpY2F0aW9ucyBhbmQgcmVnaXN0cmllcy4gIA0KKiBbSW5saW5lIFhCUkxdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlYy1ncm91cC1pbmRleC1pbmxpbmUteGJybC5odG1sKXt0YXJnZXQ9X2JsYW5rfTogSW5saW5lIFhCUkwsIG9yIGlYQlJMLCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZW1iZWRkaW5nIFhCUkwgdGFncyBpbiBIVE1MIGRvY3VtZW50cy4gIA0KKiBbUmVnaXN0cmllc10oaHR0cHM6Ly9zcGVjaWZpY2F0aW9ucy54YnJsLm9yZy9zcGVjLWdyb3VwLWluZGV4LXJlZ2lzdHJpZXMuaHRtbCl7dGFyZ2V0PV9ibGFua306IFJlZ2lzdHJpZXMgcHJvdmlkZSBhIGNlbnRyYWxpc2UgbGlzdCBvZiBkZWZpbml0aW9ucywgYWxsb3dpbmcgaW1wbGVtZW50ZXJzIHRvIHJlLXVzZSBzdWl0YWJsZSBkZWZpbml0aW9ucyBjcmVhdGVkIGJ5IG90aGVycy4gIA0KKiBbVGFibGUgTGlua2Jhc2VdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlYy1ncm91cC1pbmRleC10YWJsZS1saW5rYmFzZS5odG1sKXt0YXJnZXQ9X2JsYW5rfTogUHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHRheG9ub215IGF1dGhvcnMgdG8gZGVmaW5lIGEgdGFidWxhciBsYXlvdXQgb2YgZmFjdHMuIFRoZSByZXN1bHRpbmcgdGFibGVzIGNhbiBiZSB1c2VkIGZvciBib3RoIHByZXNlbnRhdGlvbiBhbmQgZGF0YSBlbnRyeS4gIA0KKiBbVGF4b25vbXkgJiBSZXBvcnQgUGFja2FnZXNdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlYy1ncm91cC1pbmRleC10YXhvbm9teS1wYWNrYWdlcy5odG1sKXt0YXJnZXQ9X2JsYW5rfTogVGF4b25vbXkgUGFja2FnZXMgcHJvdmlkZSBhIHN0YW5kYXJkaXNlZCBtZWNoYW5pc20gZm9yIHByb3ZpZGluZyBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBjb250ZW50IG9mIGEgdGF4b25vbXkuICANCiogW1ZlcnNpb25pbmddKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvc3BlYy1ncm91cC1pbmRleC1ncm91cC12ZXJzaW9uaW5nLmh0bWwpe3RhcmdldD1fYmxhbmt9OiBEZWZpbmVzIGFuIFhNTCBzeW50YXggZm9yIGFuIFhCUkwgdmVyc2lvbmluZyBSZXBvcnQuICANCg0KTGluayBmb3IgZWFjaCByZWNvbW1lbmRhdGlvbiBpbmNsdWRlcyB0aGUgbm9ybWF0aXZlIHNjaGVtYS4gDQoNCiMjIyBYQlJMIFJlcHJlc2VudGF0aW9uIG9mIERhdGEgIA0KSW4gdGhlIGludHJvZHVjdGlvbiBvZiBUREgsIGl0IHN0YXRlcyB0aGF0ICBYQlJMIHByb3ZpZGVzIGEgcGxhdGZvcm0gdG8gZ2l2ZSBkYXRhIG1lYW5pbmcgW1RESCBzZWN0aW9uIDEuMS4zIHBhZ2UgMl0uIEEgcGllY2Ugb2YgZGF0YSByZWFsbHkgZG9lcyBub3QgaGF2ZSBhIG1lYW5pbmcgd2l0aG91dCBhIGNvbnRleHQgb3IgbWVhbnMgdG8gYXNzb2NpYXRlIGRhdGEgcG9pbnRzLCBmb3IgZXhhbXBsZSwgZGF0YSBhYm91dCBhIHN3aXRjaCBiZWluZyBvbiBvciBvZmYsIGRvZXNuJ3QgaGF2ZSBtdWNoIHZhbHVlIGlmIHdlIGRvbid0IGtub3cgd2hhdCBkb2VzIHRoaXMgc3dpdGNoIGRvIGFuZCB3aGVuIHdhcyBpdCBvbiBvciBvZmYuIFhCUkwgZ2l2ZXMgbWVhbmluZyB0byBkYXRhIGJ5IHByb3ZpZGluZyBsYXllcnMgb2YgY29udGV4dC4NCg0KIyMjIyBfU29tZSBCYXNpY3NfICANClRoZSBUREggcHJlc2VudHMgdGhlIGFuIGV4YW1wbGUgb2YgYSBfbW9udGhseSBleHBlbnNlcyByZXBvcnQgW1RESCBzZWN0aW9uIDIuMiBwYWdlIDE1XV8gb2YgYSBwZXJzb24gbmFtZWQgIkJvYiIsIHRoZSByZXBvcnQgaXMgaW4gdGhlIGZvcm0gb2YgYSB0YWJsZSB3aXRoIGl0cyByb3dzIGhhdmluZyBleHBlbnNlcyBsaW5lIGl0ZW1zLCBhbmQgY29sdW1ucyBoYXZpbmcgbW9udGhzIGFuZCBhbW91bnRzIG9mIGV4cGVuc2VzLiAgDQoNClRoZSBUREggZXhwbGFpbnMgdGhhdCBleHBlbnNlcyBhbW91bnRzIGFsb25lIGRvIG5vdCBjb252ZXkgbXVjaCBtZWFuaW5nIHVubGVzcyBhc3NvY2lhdGVkIHdpdGggX2RpbWVuc2lvbnNfIGlkZW50aWZ5aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFtb3VudHMsIGZvciBleGFtcGxlLCB3aG8gbWFkZSB0aGUgZXhwZW5zZXMsIHdoYXQgaXMgdGhlIG5hdHVyZSBvZiB0aGUgZXhwZW5zZSwgYW5kIGluIHdoaWNoIHBlcmlvZHMgZXhwZW5zZXMgd2VyZSBtYWRlLiBUaGUgaW50ZXJzZWN0aW9uIG9mIG9uZSBvciBtb3JlIG9mIHRoZXNlIGRpbWVuc2lvbnMgd2l0aCBhbiBhbW91bnQgY3JlYXRlcyBhIF9mYWN0XyB0aGF0IGhhcyBjb250ZXh0dWFsIG1lYW5pbmcuICANCg0KT25lIG9mIHRoZSBiYXNpYyBjb25jZXB0cyBvZiBYQlJMIGRlc2lnbiBpcyB0aGF0IGl0IGlkZW50aWZpZXMgZGF0YSBwb2ludHMgYnkgbXVsdGlwbGUgZGltZW5zaW9ucyB0aGF0IGdpdmVzIGVub3VnaCBjb250ZXh0IHRvIHRoZSBkYXRhIHBvaW50IHRvIGJlIG1lYW5pbmdmdWwsIGxpa2UgaW4gdGhlIGNhc2Ugb2YgdGhlIGV4cGVuc2UgcmVwb3J0IChUREggZXhhbXBsZSksIGFuIGFtb3VudCBvZiBgJDkwMGAgaW4gdGhlIGZpcnN0IHJvdywgaXMgaWRlbnRpZmllZCBieSBkaW1lbnNpb25zIGBGb29kYCBhcyBuYXR1cmUgb2YgZXhwZW5zZSwgYW5kIGBKYW51YXJ5YCBhcyBleHBlbnNlIHBlcmlvZCwgYW5kIGBCb2JgIGFzIHRoZSBwZXJzb24gd2hvIG1hZGUgdGhlIGV4cGVuc2UsIHdoaWNoIGNyZWF0ZXMgYW4gWEJSTCBgRmFjdGAuICANCg0KVGhlIFRESCBjbGFzc2lmaWVzIGRpbWVuc2lvbnMgdGhhdCBpZGVudGlmaWVzIGZhY3RzIGluIFhCUkwgaW50byAyIGNhdGVnb3JpZXM6ICANCg0KMS4gYENvcmUgRGltZW5zaW9uc2Agd2hpY2ggaW5jbHVkZXM6ICANCiAgICArICoqX0NvbmNlcHRfKiogY29yZSBkaW1lbnNpb246IEEgdGF4b25vbXkgZWxlbWVudCAoZGljdGlvbmFyeS92b2NhYnVsYXJ5KSB0aGF0IHByb3ZpZGVzIHRoZSBtZWFuaW5nIGZvciBhIGZhY3QgKGUuZy4gRml4ZWQgQXNzZXRzLCBSZXZlbnVlLCBQcm9maXQgLi4uKSwgY29uY2VwdHMgYXJlIHRoZSBidWlsZGluZyBibG9ja3Mgb2YgYSB0YXhvbm9teS4gIA0KICAgICsgKipfUGVyaW9kXyoqIGNvcmUgZGltZW5zaW9uOiBUaW1lIGZyYW1lIG9yIHBvaW50IG9mIHRpbWUgcmVsZXZhbnQgdG8gdGhlIGZhY3QuICANCiAgICArICoqX1JlcG9ydGluZyBlbnRpdHlfKiogIGNvcmUgZGltZW5zaW9uOiBUaGUgZW50aXR5IHJlcG9ydGluZyB0aGUgZmFjdCwgYWxzbyBrbm93biBhcyBgaWRlbnRpZmllcmAgIA0KICAgICsgKipfVW5pdF8qKiBjb3JlIGRpbWVuc2lvbjogVW5pdCBvZiBtZWFzdXJlbWVudCBvZiByZXBvcnRlZCBmYWN0IChlLmcuIFVTRCwgRVVSTywgS00sIEtHTSwgVVNEL1NoYXJlLi4uKSwgaXQgaXMgb25seSByZXF1aXJlZCBmb3IgbnVtZXJpYyBmYWN0cy4gDQoNCjIuIGBUYXhvbm9teSBEZWZpbmVkIERpbWVuc2lvbnNgOiBDb25jZXB0cyB0aGF0IGV4aXN0IGZvciB0aGUgcHVycG9zZSBvZiBncm91cGluZyBmYWN0cyB0aGF0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBpbiBhIHNpbWlsYXIgd2F5LiBUYXhvbm9teSBEZWZpbmVkIERpbWVuc2lvbnMgZG8gbm90IGRpcmVjdGx5IGRlZmluZSBhIGZhY3QgYnV0IHJhdGhlciBpbnRlcnNlY3Qgd2l0aCBhIGZhY3QgdG8gYWRkIGZ1cnRoZXIgY29udGV4dHVhbCBvciBzZW1hbnRpYyBpbmZvcm1hdGlvbiBiZXlvbmQgd2hhdCBpcyBhZGRlZCBieSB0aGUgY29yZSBkaW1lbnNpb25zLCBmb3IgZXhhbXBsZSBhIGNvdW50cnkgZGltZW5zaW9uIGZvciBnZW9ncmFwaGljYWwgYWxsb2NhdGlvbi4NCg0KVGhlIENvcmUgRGltZW5zaW9uIGFuZCBUYXhvbm9teSBEZWZpbmVkIERpbWVuc2lvbnMgYXJlIGRlZmluZWQgaW4gdGhlIFhCUkwgVGF4b25vbXkgb3IgaXRzIGV4dGVuc2lvbnMgdXNpbmcgWEJSTCBjb21wb25lbnRzLCBhbmQgdGhlbiB1c2VkIGluIGFuIFhCUkwgaW5zdGFuY2UgdG8gcmVwb3J0IGZhY3RzLiAgDQoNCiMjIyMgX1hCUkwgRWxlbWVudHMgVXNhZ2VfICANClhCUkwgc3BlY2lmaWNhdGlvbnMgZGVmaW5lIGhvdyB3ZSBjYW4gZXhwcmVzcyBhIGZpbmFuY2lhbCByZXBvcnQsIG5leHQgd2Ugd2lsbCBsb29rIGF0IHRoZSBYQlJMIGVsZW1lbnRzIHVzZWQgdG8gZGVzY3JpYmUgYSBkYXRhIHBvaW50LiAgDQoNCkFzc3VtaW5nIHdlIHdhbnQgdG8gY3JlYXRlIGFuIFhCUkwgcmVwb3J0IGZvcm0gdGhlIG1vbnRobHkgZXhwZW5zZXMgZXhhbXBsZSwgZmlyc3Qgd2UgbmVlZCB0byB1c2UgWEJSTCBzcGVjaWZpY2F0aW9ucyB0byBjcmVhdGUgYSB0YXhvbm9teSBjb250YWluaW5nIHRoZSB2b2NhYnVsYXJ5IGFuZCBsaW5rYmFzZXMsIHRoZW4gd2UgY2FuIGNyZWF0ZSBhbiBYQlJMIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIGZhY3RzLCBsZXQncyB0cnkgdG8gY3JlYXRlIGZldyBlbGVtZW50cyBhbmQgZGlzY292ZXIgdGhlIGJhc2ljIHVzYWdlIG9mIFhCUkwgZWxlbWVudHMuICANCg0KIyMjIyBfQ3JlYXRpbmcgWEJSTCBUYXhvbm9teSBgQ29uY2VwdGBfICANCkNvbmNlcHRzIGluIGFuIFhCUkwgdGF4b25vbXkgYXJlIGVsZW1lbnRzIHRoYXQgcHJvdmlkZXMgYSBtZWFuaW5nIGZvciBhIGZhY3QsIGl0IGlzIGRlZmluZWQgaW4gdGhlIFhCUkwgVGF4b25vbXkgc2NoZW1hLiBDb25jZXB0cyBtYWtlIHVwIHRoZSBkaWN0aW9uYXJ5L3ZvY2FidWxhcnkgYWxsb3dlZCB0byBiZSB1c2VkIGJ5IHRoZSBUYXhvbm9teS4gIA0KDQpJbiBjYXNlIG9mIGEgZmluYW5jaWFsIHJlcG9ydGluZyB0YXhvbm9teSwgY29uY2VwdHMgd2lsbCBkZXNjcmliZSBudW1lcmljIGZpbmFuY2lhbCBlbGVtZW50cyBzdWNoIGFzIGBOZXQgUHJvZml0YCwgYEFzc2V0c2Agb3IgYExpYWJpbGl0aWVzYCwgb3IgbmFycmF0aXZlIGVsZW1lbnRzLCBsaWtlIGBBY2NvdW50aW5nIFBvbGljaWVzYC4gSW4gc2hvcnQsIGEgY29uY2VwdCBuZWVkIHRvIGJlIGNyZWF0ZWQgZm9yIGV2ZXJ5IHJlcG9ydGFibGUgZWxlbWVudCB3aXRoaW4gdGhlIGRvbWFpbiBvZiB0aGUgdGF4b25vbXksIGNvbmNlcHRzIGFyZSB0aGUgYmFja2JvbmUgb2YgdGhlIFRheG9ub215LiAgDQoNCkxldCdzIGRlZmluZSBgRm9vZGAgY29uY2VwdCAoZnJvbSB0aGUgbW9udGhseSBleHBlbnNlcyByZXBvcnQpLCB3aXRoIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWNzOiAgDQoNCiogSGFzIGEgYGRlYml0YCBiYWxhbmNlLCAgDQoqIEl0cyB2YWx1ZSBDYW5ub3QgYmUgbnVsbCAoYWJzZW50IHZhbHVlKSwgaXQgY2FuIGhhdmUgYSB2YWx1ZSBvZiBgMGAgdGhvdWdoLCAgDQoqIEl0IGlzIGEgbW9uZXRhcnkgaXRlbSwgbWVhbmluZyB0aGF0IGl0IG5lZWRzIHRvIGhhdmUgYSBudW1lcmljIHZhbHVlIGFuZCBhIHVuaXQNCg0KQ29uY2VwdCBpcyBkZWZpbmVkIGluIHRoZSB0YXhvbm9teSBTQ0hFTUEgYXMgZm9sbG93czogIA0KDQpgYGB7WE1MIGV4YW1wbGVfMV9zY2hlbWFfMDF9DQo8IS0tIEZyb20gdGF4b25vbXkgc2NoZW1hIGZpbGUgKC54c2QpIC0tPg0KPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQogIHhtbG5zOmV4YW1wbGU9Imh0dHA6Ly93d3cuZXhwZW5zZXMuY29tL3RheG9ub215Ig0KICB4bWxuczp4YnJsaT0iaHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2luc3RhbmNlIg0KICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIg0KICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhwZW5zZXMuY29tL3RheG9ub215Ij4NCiAgICANCiAgICA8ZWxlbWVudCANCiAgICAgIHhicmxpOm5hbWU9IkZvb2QiDQogICAgICB4YnJsaTpwZXJpb2RUeXBlPSJkdXJhdGlvbiINCiAgICAgIHhicmxpOmJhbGFuY2U9ImRlYml0Ig0KICAgICAgbmlsbGFibGU9ImZhbHNlIg0KICAgICAgYWJzdHJhY3Q9ImZhbHNlIg0KICAgICAgdHlwZT0ieGJybGk6bW9uZXRhcnlJdGVtVHlwZSINCiAgICAgIHN1YnN0aXR1c3Rpb25Hcm91cD0ieGJybGk6aXRlbSINCiAgICAgIGlkPSJleHBlbnNlX0Zvb2QiLz4NCiAgICAgICAgDQo8L3hzOnNjaGVtYT4NCmBgYA0KX05vdGVzOl8gIA0KDQoqIE5hbWVzcGFjZSBgaHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2luc3RhbmNlYCBwcmVmaXhlZCBhcyBgeGJybGlgIHdhcyBkZWNsYXJlZCBmb3IgWEJSTCBzcGVjaWZpY2F0aW9uIHNjaGVtYSB0byBiZSBhYmxlIHRvIHVzZSBlbGVtZW50cyBmb3JtIHRoYXQgbmFtZXNwYWNlLiANCiogV2UgZ2F2ZSBvdXIgdGF4b25vbXkgdGhlIG5hbWVzcGFjZSBgaHR0cDovL3d3dy5leHBlbnNlcy5jb20vdGF4b25vbXlgIHByZWZpeGVkIGFzIGBleHBlbnNlc2ANCiogYGR1cmF0aW9uYCB3YXMgc2VsZWN0ZWQgZm9yIGB4YnJsaTpwZXJpb2RUeXBlYCBYQlJMIGF0dHJpYnV0ZSwgYmVjYXVzZSB0aGlzIGlzIGFuIGV4cGVuc2UgdGhhdCBvY2N1cnMgZHVyaW5nIGEgc3BlY2lmaWVkIHBlcmlvZCAobm90IGEgYmFsYW5jZSBhdCBhIG1vbWVudCBvZiB0aW1lKS4gIA0KKiBFYWNoIGVsZW1lbnQgbXVzdCBoYXZlIGEgdW5pcXVlIGlkLiAgDQoqIEJlY2F1c2Ugd2UgcmVmZXJlZCB0byBYQlJMIHNwZWNpZmljYXRpb24sIHRoaXMgc2NoZW1hIGRvY3VtZW50IGNhbiBiZSB2YWxpZGF0ZWQgYWdhaW5zdCBYQlJMIHNlcGNpZmljYXRpb25zLg0KDQoNCiMjIyMgX0NyZWF0aW5nIFhCUkwgaW5zdGFuY2UgYENvbnRleHRgXyAgDQpBc3N1bWluZyB3ZSB3YW50IHRvIHJlcG9ydCB0aGF0IGBCb2JgJ3MgYEZvb2RgIGV4cGVuc2VzIGZvciBKYW51YXJ5IDIwMjAgd2FzICQ5MDAsIG5vdGUgaGVyZSB0aGF0IHdlIGF0dGFjaGVkIDMgcGllY2VzIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhlIGV4cGVuc2UgYW1vdW50LCBgRm9vZGAgdGhlIGNvbmNlcHQgY29yZSBkaW1lbnNpb24sIGBCb2JgIHRoZSBvd25lciBvZiB0aGUgZXhwZW5zZSBhbmQgYEphbnVhcnkgMjAyMGAgdGhlIHBlcmlvZCBjb3JlIGRpbWVuc2lvbi4gd2UgYWxyZWFkeSBkZWZpbmVkIHRoZSBgRm9vZGAgY29uY2VwdCBhYm92ZSwgdG8gYXR0YWNoIHRoZSBvd25lciBvZiB0aGUgZXhwZW5zZXMgYW5kIHRoZSBwZXJpb2Qgd2UgbmVlZCB0byB1c2UgWEJSTCBgY29udGV4dGAgZWxlbWVudC4gIA0KDQpgY29udGV4dGAgaXMgYW4gWEJSTCBlbGVtZW50IHVzZWQgaW4gWEJSTCBpbnN0YW5jZSBkb2N1bWVudCAocmVwb3J0KSBhbmQgcmVmZXJlbmNlZCBieSBvbmUgb3IgbW9yZSBmYWN0KHMpIGluIHRoZSBYQlJMIHJlcG9ydC4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgcGVyaW9kLCBlbnRpdHksIGFuZCBvdGhlciB0YXhvbm9teSBkZWZpbmVkIGRpbWVuc2lvbiByZWxhdGluZyB0byB0aGlzIGNvbnRleHQuICANCg0KV2UgY2FuIGRlZmluZSBhIGNvbnRleHQgZm9yIGBCb2JgIG93bmVyLCBhbmQgSmFudWFyeSAyMDIwIHBlcmlvZCBhcyBmb2xsb3dzOiAgDQpgYGB7WE1MIGV4YW1wbGVfMV9pbnN0YW5jZV8wMX0NCjwhLS0gZGVmaW5lZCBpbiBpbnN0YW5jZSBkb2N1bWVudCAtLT4NCjx4YnJsIHhtbG5zPSJodHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvaW5zdGFuY2UiDQogICAgICB4bWxuczpleHBlbnNlcz0iaHR0cDovL3d3dy5leHBlbnNlcy5jb20vdGF4b25vbXkiDQogICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWw6bGFuZz0iZW4tVVMiPg0KICAgIDwhLS0gLi4uIGF0IGxlYXN0IG9uZSBsaW5rOnNjaGVtYVJlZiBlbGVtZW50IGdvZXMgaGVyZSAuLi4gLS0+DQogICAgPGNvbnRleHQgaWQ9IjAxIj4NCiAgICAgIDxlbnRpdHk+DQogICAgICAgIDxpZGVudGlmaWVyIHNjaGVtZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ib2IiPkJvYjwvaWRlbnRpZmllcj4NCiAgICAgIDwvZW50aXR5Pg0KICAgICAgPHBlcmlvZD4NCiAgICAgICAgPHN0YXJ0RGF0ZT4yMDIwLTAxLTAxPC9zdGFydERhdGU+DQogICAgICAgIDxlbmREYXRlPjIwMjAtMDEtMzE8L2VuZERhdGU+DQogICAgICA8L3BlcmlvZD4NCiAgICA8L2NvbnRleHQ+DQo8L3hicmw+DQpgYGANCl9Ob3RlcyBYQlJMIGluc3RhbmNlIGRvY3VtZW50XyAgDQoNCiogWEJSTCBpbnN0YW5jZSBkb2N1bWVudCByb290IGVsZW1lbnQgbXVzdCBiZSBlbGVtZW50IGA8eGJybD5gICANCiogV2UgcmVmZXJlbmNlZCBvdXIgdGF4b25vbXkgbmFtZXNwYWNlIHRvIGJlIGFibGUgdG8gdXNlIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhhdCB0YXhvbm9teS4gIA0KKiBXZSByZWZlcmVuY2VkIFhCUkwgc2NoZW1hICh3aXRoIG5vIHByZWZpeCkgdG8gYmUgYWJsZSB0byB1c2UgWEJSTC4gIA0KKiBCZWNhdXNlIG9mIHRoZSByZWZlcmVuY2VzIGFib3ZlLCB0aGlzIFhCUkwgaW5zdGFuY2UgZG9jdW1lbnQgY2FuIGJlIHZhbGlkYXRlZCBhZ2FpbnN0IFhCUkwgc3BlY2lmaWNhdGlvbnMgYW5kIG91ciB0YXhvbm9teS4gIA0KDQojIyMjIF9DcmVhdGluZyBYQlJMIGluc3RhbmNlIGB1bml0YF8gIA0KWEJSTCByZXF1aXJlcyB0aGF0IG51bWVyaWMgZmFjdHMgaGFzIGEgcmVmZXJlbmNlIHRvIGEgdW5pdCBbW3NlZSBYQlJMIHNwZWNzIDQuNi4yXShodHRwczovL3d3dy54YnJsLm9yZy9TcGVjaWZpY2F0aW9uL1hCUkwtMi4xL1JFQy0yMDAzLTEyLTMxL1hCUkwtMi4xLVJFQy0yMDAzLTEyLTMxK2NvcnJlY3RlZC1lcnJhdGEtMjAxMy0wMi0yMC5odG1sI180LjYuMildLiBBbmQgc2luY2Ugb3VyIGNvbmNlcHQgaW4gbW9uZXRhcnkgdHlwZSB3aGljaCBpcyBudW1lcmljIHR5cGUsIHRoZW4gd2UgbmVlZCB0byBjcmVhdGUgYSB1bml0IGluIG91ciBpbnN0YW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIGNvbnRleHQgYmVmb3JlIHdlIGFyZSBhYmxlIHRvIGNyZWF0ZSBhIGZhY3QuIA0KDQpXZSBkZWNsYXJlIGEgdW5pdCBmb3IgVW5pdGVkIFN0YXRlcyBEb2xsYXJzIHVzaW5nIGBpc280MjE3YCB0YXhvbm9teSBgVVNEYCBlbGVtZW50IGFzIGZvbGxvd3M6ICANCmBgYHtYTUwgZXhhbXBsZV8xX2luc3RhbmNlXzAyfQ0KPCEtLSBBZGRlZCB0byBwcmV2aW91cyBpbnN0YW50IGRvY3VtZW50IGFzIGNoaWxkIHRvIDx4YnJsPiBlbGVtZW50IC0tPg0KPHVuaXQgaWQ9InVzZCIgeG1sbnM6aXNvNDIxNz0iaHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2lzbzQyMTciPg0KICA8bWVhc3VyZT5pc280MjE3OlVTRDwvbWVhc3VyZT4NCjwvdW5pdD4NCg0KYGBgDQoNCiMjIyMgX0NyZWF0aW5nIFhCUkwgaW5zdGFuY2UgYGZhY3RgXyAgDQpOb3cgdGhhdCB3ZSBoYXZlIGBGb29kYCBjb25jZXB0IGluIG91ciBYQlJMIFRheG9ub215IGFuZCBoYXZlIGEgY29udGV4dCB3aXRoIGBpZD0wMWAgYW5kIGEgdW5pdCBvZiBgaWQ9InVzZCJgIGluIG91ciBpbnN0YW5jZSBkb2N1bWVudCwgd2UgY2FuIGNyZWF0ZSBhIGZhY3QgZm9yIGBCb2JgJ3MgYEZvb2RgIGV4cGVuc2VzIGZvciB0aGUgcGVyaW9kIG9mIGBKYW51YXJ5IDIwMjBgIGZvciB0aGUgYW1vdW50IG9mIGA5MDBgIFVuaXRlZCBTdGF0ZXMgRG9sbGFycyBhcyBmb2xsb3dzOiAgDQpgYGB7WE1MIGV4YW1wbGVfMV9pbnN0YW5jZV8wM30NCjwhLS0gQWRkZWQgdG8gcHJldmlvdXMgaW5zdGFudCBkb2N1bWVudCBhcyBjaGlsZCB0byA8eGJybD4gZWxlbWVudCAtLT4NCg0KPGV4cGVuc2VzOkZvb2QNCiAgY29udGV4dFJlZj0iMDEiIA0KICBkZWNpbWFscz0iMCIgDQogIGlkPSJmYWN0XzAwMSIgDQogIHVuaXRSZWY9InVzZCI+OTAwPC9leHBlbnNlczpGb29kPg0KYGBgDQoNCg0KIyMjIyBfWEJSTCBEaW1lbnNpb25zXyAgDQpBcyBtZW50aW9uZWQgWEJSTCBwcm92aWRlcyB0b29scyBmb3IgcmVwb3J0aW5nIG11bHRpZGltZW5zaW9uYWwgZmFjdHMsIGFzIG1lbnRpb25lZCBjb3JlIGRpbWVuc2lvbnMgKENvbmNlcHQsIHBlcmlvZCwgcmVwb3J0aW5nIGVudGl0eSBhbmQgdW5pdCkgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBYQlJMIGJhc2Ugc3BlY2lmaWNhdGlvbnMsIGluIGFkZGl0aW9uIHRvIHNvbWUgb3RoZXIgdG9vbHMsIGZvciB0YXhvbm9teSBkZWZpbmVkIGRpbWVuc2lvbnMgYW5kIG1vcmUgY29tcGxleCBtdWx0aWRpbWVuc2lvbmFsIHN0cnVjdHVyZXMgX1tYQlJMIERpbWVuc2lvbnMgU3BlY2lmaWNhdGlvbnNdKGh0dHBzOi8vc3BlY2lmaWNhdGlvbnMueGJybC5vcmcvd29yay1wcm9kdWN0LWluZGV4LWdyb3VwLWRpbWVuc2lvbnMtZGltZW5zaW9ucy5odG1sKV8gYXJlIHVzZWQuICANCg0KIyMjIyMgX0FkZGl0aW9uYWwgRGltZW5zaW9ucyBmcm9tIGJhc2UgWEJSTF8gIA0KWEJSTCBlbGVtZW50IGBjb250ZXh0YCBoYXMgMiBhZGRpdGlvbmFsIGZlYXR1cmVzIHRoYXQgY2FuIHByb3ZpZGUgZGltZW5zaW9uYWxpdHkgdG8gYSBmYWN0LCB0aGUgYDxzZWdtZW50PmAgYW5kIGA8c2NlbmFyaW8+YCBhcyBmb2xsb3dzOiAgDQoNCiogYDxzZWdtZW50PmA6IGlzIGRlZmluZWQgaW4gWEJSTCBzcGVjaWZpY2F0aW9ucyBhcyBfImFuIG9wdGlvbmFsIGNvbnRhaW5lciBmb3IgYWRkaXRpb25hbCBtYXJrLXVwIHRoYXQgdGhlIHByZXBhcmVyIG9mIGFuIFhCUkwgSW5zdGFuY2UgU0hPVUxEIHVzZSB0byBpZGVudGlmeSB0aGUgYnVzaW5lc3Mgc2VnbWVudCBtb3JlIGNvbXBsZXRlbHkgaW4gY2FzZXMgd2hlcmUgdGhlIEVudGl0eSBpZGVudGlmaWVyIGlzIGluc3VmZmljaWVudC4iXyBJdCBzaG91bGQgYWxzbyBiZSBtZW50aW9uZWQgdGhhdCB0aGUgYDxzZWdtZW50PmAgZWxlbWVudCBpcyB1c2VkIHRvIGxpbmsgd2l0aCB0YXhvbm9teSBkZWZpbmVkIGRpbWVuc2lvbiB1c2luZyBfWEJSTCBEaW1lbnNpb25zIFNwZWNpZmljYXRpb25zXy4gIA0KDQoqIGA8c2NlbmFyaW8+YDogWEJSTCBzcGVjaWZpY2F0aW9ucyBkZXNjcmliZXMgdGhpcyBlbGVtZW50IGFzIF8iQnVzaW5lc3MgZmFjdHMgY2FuIGJlIHJlcG9ydGVkIGFzIGFjdHVhbCwgYnVkZ2V0ZWQsIHJlc3RhdGVkLCBwcm8gZm9ybWEsIGV0Yy4gRm9yIGludGVybmFsIHJlcG9ydGluZyBwdXJwb3NlcywgdGhlcmUgY2FuIGJlIGFuIGV2ZW4gZ3JlYXRlciB2YXJpZXR5IG9mIGFkZGl0aW9uYWwgbWV0YWRhdGEgdGhhdCBwcmVwYXJlcnMgd2FudCB0byBhc3NvY2lhdGUgd2l0aCBpdGVtcy4gVGhlIG9wdGlvbmFsIDxzY2VuYXJpbz4gZWxlbWVudCBhbGxvd3MgYWRkaXRpb25hbCB2YWxpZCBtYXJrLXVwIChzZWUgbm90ZSBhYm92ZSByZWdhcmRpbmcgc2VnbWVudCkgdG8gYmUgaW5jbHVkZWQgZm9yIHRoaXMgcHVycG9zZS4iXyAgDQoNCioqU2VnbWVudCBhbmQgU2NlbmFyaW8gRXhhbXBsZSoqICANCg0KSW4gdGhlIG1vbnRobHkgZXhwZW5zZSByZXBvcnQgZXhhbXBsZSwgYXNzdW1lIHRoZSBgQm9iYCBoYXMgMiBsb2NhdGlvbnMgdG8gdHJhY2sgZXhwZW5zZXMgZm9yIGBob21lYCBhbmQgYG9mZmljZWAgKHNlZ21lbnRzKSwgYWxzbyBhc3N1bWUgdGhhdCBgQm9iYCB0cmFja3MgYGJ1ZGdldGAgYW5kIGBhY3R1YWxzYCAoc2NlbmFyaW9zKSwgdG8gYmUgYWJsZSB0byBpbmNsdWRlIHRoZXNlIGRpbWVuc2lvbnMgaW4gb3VyIHJlcG9ydCB3ZSBuZWVkIHRvIGZpcnN0IHRvIGNyZWF0ZSBhbiBleHRlbnNpb24gdGF4b25vbXkgdG8gaW5jbHVkZSB0aGVzZSBlbGVtZW50cyBhcyBmb2xsb3dzOg0KDQpgYGB7WE1MIHNlZ2VtZW50X3NjZW5hcmlvX3hzZH0NCjwhLS0gUmVwb3J0IHNwZWNpZmljIHRheG9ub215IGV4dGVuc2lvbiAtLT4NCjxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYm9icmVwb3J0LmNvbS94YnJsL3RheG9ub215IiANCgkJeG1sbnM6Ym9iPSJodHRwOi8vYm9icmVwb3J0LmNvbS94YnJsL3RheG9ub215IiANCgkJeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiANCgkJeG1sbnM6eGJybGk9Imh0dHA6Ly93d3cueGJybC5vcmcvMjAwMy9pbnN0YW5jZSI+DQoJCSAgDQoJPCEtLSBUeXBlIGZvciBzZWdtZW50cyAtLT4NCgk8c2ltcGxlVHlwZSBuYW1lPSJsb2NhdGlvbnNUeXBlIj4NCgkJPHJlc3RyaWN0aW9uIGJhc2U9InRva2VuIj4NCgkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iaG9tZSIvPg0KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJvZmZpY2UiLz4NCgkJPC9yZXN0cmljdGlvbj4NCgk8L3NpbXBsZVR5cGU+DQoJCSAgDQoJPCEtLSByZXBvcnQgc3BlY2lmaWMgc2VnbWVudCBzdWItZWxlbWVudCAtLT4NCgk8ZWxlbWVudCBuYW1lPSJsb2NhdGlvbnMiIHR5cGU9ImJvYjpsb2NhdGlvbnNUeXBlIiAvPg0KCQkgIA0KCQkgIA0KCTwhLS0gVHlwZSBmb3Igc2NlbmFyaW9zIC0tPg0KCTxzaW1wbGVUeXBlIG5hbWU9ImFjdHVhbEJ1ZGdldFR5cGUiPg0KCQk8cmVzdHJpY3Rpb24gYmFzZT0idG9rZW4iPg0KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJhY3R1YWwiLz4NCgkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iYnVkZ2V0Ii8+DQoJCTwvcmVzdHJpY3Rpb24+DQoJPC9zaW1wbGVUeXBlPg0KCQkgIA0KCTwhLS0gcmVwb3J0IHNwZWNpZmljIHNjbmVhcmlvIHN1Yi1lbGVtZW50IC0tPg0KCTxlbGVtZW50IG5hbWU9ImFjdHVhbEJ1ZGdldCIgdHlwZT0iYm9iOmFjdHVhbEJ1ZGdldFR5cGUiIC8+DQoJCSAgDQoJCSAgDQoJCSAgDQo8L3NjaGVtYT4NCg0KYGBgDQoNCioqX05vdGVfKioNCj4gRWxlbWVudHMgY29udGFpbmVkIGJ5IHRoZSA8c2NlbmFyaW8+IGVsZW1lbnQgTVVTVCBOT1QgYmUgZGVmaW5lZCBpbiB0aGUgaHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2luc3RhbmNlIG5hbWVzcGFjZS4gQWxzbywgdGhleSBNVVNUIE5PVCBiZSBpbiB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBodHRwOi8vd3d3Lnhicmwub3JnLzIwMDMvaW5zdGFuY2UgbmFtZXNwYWNlLiBUaGUgPHNjZW5hcmlvPiBlbGVtZW50IE1VU1QgTk9UIGJlIGVtcHR5LiBgciB0dWZ0ZTo6cXVvdGVfZm9vdGVyKCctLS0gW1hCUkwgc3BlY2lmaWNhdGlvbnNdKGh0dHBzOi8vd3d3Lnhicmwub3JnL1NwZWNpZmljYXRpb24vWEJSTC0yLjEvUkVDLTIwMDMtMTItMzEvWEJSTC0yLjEtUkVDLTIwMDMtMTItMzErY29ycmVjdGVkLWVycmF0YS0yMDEzLTAyLTIwLmh0bWwjXzQuNy40KScpYA0KDQpUbyByZXBvcnQgZmFjdHMgb24gYSBzZWdtZW50IGFuZC9vciBzY2VuYXJpbyBlbGVtZW50cywgd2UgbmVlZCBmaXJzdCB0byBpbmNsdWRlIHRoZSBuYW1lc3BhY2UgYGh0dHA6Ly9ib2JyZXBvcnQuY29tL3hicmwvdGF4b25vbXlgIGluIG91ciBpbnN0YW5jZSByZXBvcnQgdG8gYWNjZXNzIHRoZXNlIGVsZW1lbnRzLCB0aGVuIHdlIG5lZWQgdG8gY3JlYXRlIGNvbnRleHRzIHdpdGggdGhvc2UgZWxlbWVudHMgdGhlbiByZWZlcmVuY2UgdGhlc2UgY29udGV4dHMgaW4gdGhlIHJlcG9ydGVkIGZhY3RzIGFzIGZvbGxvd3M6ICANCg0KYGBge1hNTCBzZWdtZW50X3NjZW5hcmlvX2luc3RhbmNlfQ0KPCEtLSBBZGRlZCB0byBwcmV2aW91cyBpbnN0YW50IGRvY3VtZW50IGFzIGNoaWxkcmVuIHRvIDx4YnJsPiBlbGVtZW50IC0tPg0KICA8eGJybCAuLi4uLi4uIHhtbG5zOmJvYj0iaHR0cDovL2JvYnJlcG9ydC5jb20veGJybC90YXhvbm9teSI+DQogIDwhLS0gLi4uIGF0IGxlYXN0IG9uZSBsaW5rOnNjaGVtYVJlZiBlbGVtZW50IGdvZXMgaGVyZSAuLi4gLS0+DQogICAgPGNvbnRleHQgaWQ9IjAyIj4NCiAgICAgIDxlbnRpdHk+DQogICAgICAgIDxpZGVudGlmaWVyIHNjaGVtZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ib2IiPkJvYjwvaWRlbnRpZmllcj4NCiAgICAgIDwvZW50aXR5Pg0KICAgICAgPHBlcmlvZD4NCiAgICAgICAgPHN0YXJ0RGF0ZT4yMDIwLTAxLTAxPC9zdGFydERhdGU+DQogICAgICAgIDxlbmREYXRlPjIwMjAtMDEtMzE8L2VuZERhdGU+DQogICAgICA8L3BlcmlvZD4NCiAgDQogICAgICA8c2VnbWVudD4NCiAgICAgICAgICA8Ym9iOmxvY2F0aW9ucz5ib2I6aG9tZTwvYm9iOmxvY2F0aW9uPg0KICAgICAgPC9zZWdtZW50Pg0KICANCiAgICAgIDxzY2VuYXJpbz4NCiAgICAgICAgICA8Ym9iOmFjdHVhbEJ1ZGdldD5ib2I6YWN0dWFsPC9ib2I6YWN0dWFsQnVkZ2V0Pg0KICAgICAgPC9zY2VuYXJpbz4NCiAgDQogICAgPC9jb250ZXh0Pg0KDQpgYGANCg0KTm93IGhhdmluZyBjb250ZXh0IGBpZD0wMmAgd2UgY2FuIHJlZmVyZW5jZSB0aGUgZmFjdHMgdGhhdCBpbmNsdWRlIGBhY3R1YWxgIGZpZ3VyZXMgZm9yIGxvY2F0aW9uIGBob21lYCBpbiBvdXIgaW5zdGFuY2UgcmVwb3J0LiAgDQoNCg0KIyMjIyMgVGF4b25vbXkgZGVmaW5lZCBkaW1lbnNpb25zICAgDQpUYXhvbm9teSBkZWZpbmVkIGRpbWVuc2lvbnMgZW5hYmxlIGNyZWF0aW9uIG9mIGNvbXBsZXggc3RydWN0dXJlcyBpbiBYQlJMIHRheG9ub215IGFuZCByZXBvcnRzLiBUaGlzIGlzIGFjaGlldmVkIHRocm91Z2ggdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIGNvbmNlcHRzIGFuZCBsaW5rYmFzZXMsIHRoaXMgaXMgYmVzdCBkZXNjcmliZWQgaW4gVERIIHNlY3Rpb24gMi4yLjUgcGFnZSAyMSBhcyBmb2xsb3dzOiAgDQoNCj5BIHRheG9ub215LWRlZmluZWQgZGltZW5zaW9uIGlzIGEgZ3JvdXBpbmcgb2YgY29uY2VwdHMgdGhhdCBpcyB1c2VkIHRvIGFkZCBvcmdhbml6YXRpb25hbCBzdHJ1Y3R1cmUgdG8gZmFjdHMuIFRoZXNlIGRpbWVuc2lvbmFsIGNvbmNlcHRzIHNob3VsZCBub3QgYmUgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIGEgZGF0YSBwb2ludCBidXQgcmF0aGVyIGFyZSBlbXBsb3llZCB0byBpbmRpY2F0ZSBhZGRpdGlvbmFsIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gYmV5b25kIHRoZSBzaW1wbGUgc2VtYW50aWMgaWRlbnRpZmllciBvciB3aGF0IGlzIHByb3ZpZGVkIHRocm91Z2ggYW55IG9mIHRoZSBvdGhlciBjb3JlIGRpbWVuc2lvbnMuIEV4cGFuZGluZyB0aGUgZXhwZW5zZSBleGFtcGxlIGJ5IGF0dHJpYnV0aW5nIHRoZSBtb250aGx5IGV4cGVuc2VzIHRvIHR3byBwZW9wbGUgaW4gdGhlIHNhbWUgaG91c2Vob2xkIGNyZWF0ZXMgYSBsZXZlbCBvZiBjb21wbGV4aXR5IHRoYXQgY2Fubm90IGJlIGVhc2lseSByZXByZXNlbnRlZCB3aXRoIG9ubHkgY29uY2VwdHMuIFByZXZpb3VzbHksIHRoZXJlIHdlcmUgb25seSB0d28gZGltZW5zaW9uczogZXhwZW5zZXMgKGFzIHJvd3MpIGFuZCBtb250aHMgKGFzIGNvbHVtbnMpLmByIHR1ZnRlOjpxdW90ZV9mb290ZXIoJy0tLSBbVERIIHNlY3Rpb24gMi4yLjggcGFnZSAyNF0oaHR0cHM6Ly94YnJsdXMuZ2l0aHViLmlvL2RvY3MvdGRoLmh0bWwpJylgICANCg0KKipfU29tZSBYQlJMIERpbWVuc2lvbnMgdGVybWlub2xvZ3lfKiogIA0KDQoqIGBEaW1lbnNpb25gOiBBIHF1YWxpZnlpbmcgY2hhcmFjdGVyaXN0aWMgdGhhdCBpcyB1c2VkIHRvIHVuaXF1ZWx5IGRlZmluZSBhIGRhdGEgcG9pbnQgKG90aGVyIHRoYW4gY29yZSBkaW1lbnNpb25zKSBmb3IgZXhhbXBsZSBhICJHZW9ncmFwaHkgRGltZW5zaW9uIi4NCiogYERvbWFpbmA6IEEgc2V0IG9mIHJlbGF0ZWQgdmFsdWVzLiBFeGFtcGxlcyBvZiBkaWZmZXJlbnQgZG9tYWlucyBmb3IgdXNlIG9uIGEgImdlb2dyYXBoeSIgZGltZW5zaW9uIHdvdWxkIGJlICJDb3VudHJpZXMiLCAiQ29udGluZW50cyIgb3IgIlN0YXRlcyIuIEluIFhCUkwsIGRvbWFpbnMgYXJlIGRlZmluZWQgdXNpbmcgdGF4b25vbXkgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBncm91cCBkb21haW4gbWVtYmVycy4gIA0KKiBgRG9tYWluIG1lbWJlcmA6IEFuIGVsZW1lbnQgcmVwcmVzZW50aW5nIG9uZSBvZiB0aGUgcG9zc2liaWxpdGllcyB3aXRoaW4gYSBkb21haW4uICANCiogYEN1YmVgOiBBIGN1YmUgaXMgZGVmaW5lZCBieSBjb21iaW5pbmcgYSBzZXQgb2YgZGltZW5zaW9ucyB3aXRoIGEgc2V0IG9mIGNvbmNlcHRzLiBDdWJlcyBhcmUgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgImh5cGVyY3ViZXMiLCBhcyB1bmxpa2UgYSBwaHlzaWNhbCwgMy1kaW1lbnNpb25hbCBjdWJlLCBhIGh5cGVyY3ViZSBtYXkgaGF2ZSBhbnkgbnVtYmVyIG9mIGRpbWVuc2lvbnMuDQoNCkFsbCB0aGUgYWJvdmUgY29udHJ1Y3RzIGFyZSBkZWZpbmVkIGFzIGNvbmNlcHRzLCBidXQgdXNpbmcgWEJSTCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGB0eXBlYCBhbmQgYHN1YnN0aXR1dGlvbkdyb3VwYCBhdHRyaWJ1dGVzIHVzZWQgZm9yIGRlZmluaW5nIGEgY29uY2VwdC4gIA0KDQpUaGUgVERIIGF0IHRoaXMgc2VjdGlvbiwgc3BsaXRzIHRoZSBtb250aGx5IGV4cGVuc2VzIGJ5IEJvYidzIGNoaWxkcmVuLCB3aXRoIGVhY2ggbW9udGggc3BsaXQgaW50byAyIGNvbHVtbnMgZm9yIGVhY2ggb2YgQm9iJ3MgY2hpbGRyZW4uIEFzc3VtZSB0aGF0IHdlIHdhbnQgdG8gb3JnYW5pemUgdGhpcyBpbmZvcm1hdGlvbiBpbiBYQlJMIGJ5IGRvaW5nIHRoZSBmb2xsb3dpbmc6ICANCg0KKiBDcmVhdGUgYSBncm91cGluZyBjb25jZXB0IG9yIGhlYWRlciBjYWxsZWQgYGV4cGVuc2VzYCB0byBncm91cCBhbGwgdGhlIGV4cGVuc2VzIHRvZ2V0aGVyLCAgDQoqIENyZWF0ZSBgcGVyc29uc2AgZGltZW5zaW9uLCBhbmQgdGhlbiBjcmVhdGUgYSBgZG9tYWluYCBmb3IgYGJvYkNoaWxkcmVuRG9tYWluYCBhbmQgYGRvbWFpbiBtZW1iZXJgIGZvciBlYWNoIGNoaWxkIHJlZmVyZW5jZWQgaW4gdGhlIHJlcG9ydC4gIA0KDQpUaGlzIGNhbiBiZSBpbXBsZW1lbnRkIGluIFhCUkwgYXMgZm9sbG93czogIA0KYGBge3htbCBkaW1lbnNpb25fc2NoZW1hfQ0KPCEtLSBSZXBvcnQgc3BlY2lmaWMgdGF4b25vbXkgZXh0ZW5zaW9uIC0tPg0KPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ib2JyZXBvcnQuY29tL3hicmwvdGF4b25vbXkiIA0KCQl4bWxuczpib2I9Imh0dHA6Ly9ib2JyZXBvcnQuY29tL3hicmwvdGF4b25vbXkiIA0KCQl4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KCQl4bWxuczp4YnJsaT0iaHR0cDovL3d3dy54YnJsLm9yZy8yMDAzL2luc3RhbmNlIj4NCgkJPCEtLSBub3RlIGhlcmUgd2UgaW5jbHVkZWQgeGJybCBkaW1lbnNpb25zIHNwZWNzIHRvIGhhdmUgYWNjZXNzIHRvIGl0cyBlbGVtZW50cyAtLT4NCgkJeG1sbnM6eGJybGR0PSJodHRwOi8veGJybC5vcmcvMjAwNS94YnJsZHQiDQoJCXhtbG5zOmR0ci10eXBlcz0iaHR0cDovL3d3dy54YnJsLm9yZy9kdHIvdHlwZS8yMDIwLTAxLTIxIg0KCQkNCgkJPCEtLSBjcmVhdGUgYSBncm91cGluZyBleHBlbnNlIGVsZW1lbnQgLS0+DQoJCTxlbGVtZW50IGFic3RyYWN0PSJ0cnVlIiANCgkJICAgICAgICAgaWQ9ImV4cGVuc2VzX2Fic3RyYWN0IiANCgkJICAgICAgICAgbmFtZT0iRXhwZW5zZXNBYnN0cmFjdCIgDQoJCSAgICAgICAgIG5pbGxhYmxlPSJ0cnVlIg0KCQkgICAgICAgICB4YnJsaTpiYWxhbmNlPSJkZWJpdCINCgkJICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXA9InhicmxpOml0ZW0iIA0KCQkgICAgICAgICB0eXBlPSJ4YnJsaTptb25ldGFyeUl0ZW1UeXBlIiANCgkJICAgICAgICAgeGJybGk6cGVyaW9kVHlwZT0iZHVyYXRpb24iLz4NCgkJDQoJCTwhLS0gY3JlYXRlIHBlcnNvbnMgZGltZW5zaW9uIC0tPg0KCQk8ZWxlbWVudCBhYnN0cmFjdD0idHJ1ZSIgDQoJCSAgICAgICAgIGlkPSJkaW1fMDFfcGVyc29ucyIgDQoJCSAgICAgICAgIG5hbWU9InBlcnNvbnNEaW0iIA0KCQkgICAgICAgICBuaWxsYWJsZT0idHJ1ZSIgDQoJCSAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwPSJ4YnJsZHQ6ZGltZW5zaW9uSXRlbSIgDQoJCSAgICAgICAgIHR5cGU9InhicmxpOnN0cmluZ0l0ZW1UeXBlIiANCgkJICAgICAgICAgeGJybGk6cGVyaW9kVHlwZT0iZHVyYXRpb24iLz4NCgkJPCEtLSBjcmVhdGUgY2hpbGRyZW4gZG9tYWluIC0tPiAgICAgICAgDQoJCTxlbGVtZW50IGFic3RyYWN0PSJ0cnVlIiANCgkJICAgICAgICBpZD0iZG9tYWluXzAxX2NoaWxkcmVuIiANCgkJICAgICAgICBuYW1lPSJDaGlsZHJlbkRvbWFpbiIgDQoJCSAgICAgICAgbmlsbGFibGU9InRydWUiIA0KCQkgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwPSJ4YnJsaTppdGVtIiANCgkJICAgICAgICB0eXBlPSJkdHItdHlwZXM6ZG9tYWluSXRlbVR5cGUiIA0KCQkgICAgICAgIHhicmxpOnBlcmlvZFR5cGU9ImR1cmF0aW9uIi8+DQoJCSAgICAgICAgICANCgkJICA8IS0tIGNyZWF0ZSBkb21haW4gbWVtYmVyIGZvciBlYWNoIGNoaWxkIC0tPg0KCQkgIDxlbGVtZW50IA0KCQkgICAgICBhYnN0cmFjdD0idHJ1ZSIgDQoJCSAgICAgIGlkPSJtZW1iZXJzXzAxX2NoaWxkT25lTWVtYmVyIg0KCQkgICAgICBuYW1lPSJDaGlsZE9uZU1lbWJlciINCgkJICAgICAgbmlsbGFibGU9InRydWUiIA0KCQkgICAgICBzdWJzdGl0dXRpb25Hcm91cD0ieGJybGk6aXRlbSIgDQoJCSAgICAgIHR5cGU9ImR0ci10eXBlczpkb21haW5JdGVtVHlwZSIgDQoJCSAgICAgIHhicmxpOnBlcmlvZFR5cGU9ImR1cmF0aW9uIi8+DQoJCSAgPGVsZW1lbnQgDQoJCSAgICAgIGFic3RyYWN0PSJ0cnVlIiANCgkJICAgICAgaWQ9Im1lbWJlcnNfMDJfY2hpbGRUd29NZW1iZXIiDQoJCSAgICAgIG5hbWU9IkNoaWxkVHdvTWVtYmVyIg0KCQkgICAgICBuaWxsYWJsZT0idHJ1ZSIgDQoJCSAgICAgIHN1YnN0aXR1dGlvbkdyb3VwPSJ4YnJsaTppdGVtIiANCgkJICAgICAgdHlwZT0iZHRyLXR5cGVzOmRvbWFpbkl0ZW1UeXBlIiANCgkJICAgICAgeGJybGk6cGVyaW9kVHlwZT0iZHVyYXRpb24iLz4NCjwvc2NoZW1hPg0KPCEtLSBub3RlIGF0dHJpYnV0ZXMgdXNlZiBmcm9tIGR0ci10eXBlcyBhbmQgeGJybGR0IG5hbWVzcGFjZXM+DQoNCmBgYA0KICANCioqX05vdGVzXyoqIEFsbCBlbGVtZW50cyBkZWZpbmVkIGFib3ZlIGhhcyB0aGUgYEBhYnN0cmFjdGAgYXR0cmlidXRlIGFzIGB0dXJlYCwgdGhpcyBtZWFucyB0aGF0IHRoaXMgZWxlbWVudCBpcyBub3QgYWxsb3dlZCB0byBiZSB1c2VkIGluIFhCUkwgaW5zdGFuY2UgZG9jdW1lbnQgdG8gcmVwb3J0IGZhY3RzLCB0aGlzIGVsZW1lbnQgaXMgb25seSBmb3Igb3JnYW5pemF0aW9uIHB1cnBvc2VzLg0KDQpOb3cgd2UgY2FuIHJlZmVyZW5jZSB0aGUgZGltZW5zaW9uIGluIHRoZSBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgdGhyb3VnaCBgPGNvbnRleHQ+YCBlbGVtZW50IGFzIGZvbGxvd3M6ICANCmBgYHtYTUwgZGltX2luc3RhbmNlfQ0KPCEtLSBBZGRlZCB0byBwcmV2aW91cyBpbnN0YW50IGRvY3VtZW50IGFzIGNoaWxkcmVuIHRvIDx4YnJsPiBlbGVtZW50IC0tPg0KICA8eGJybCAuLi4uLi4uIHhtbG5zOmJvYj0iaHR0cDovL2JvYnJlcG9ydC5jb20veGJybC90YXhvbm9teSINCiAgICAgICAgICAgICAgICB4bWxuczp4YnJsZGk9Imh0dHA6Ly94YnJsLm9yZy8yMDA2L3hicmxkaSI+DQogIDwhLS0gLi4uIGF0IGxlYXN0IG9uZSBsaW5rOnNjaGVtYVJlZiBlbGVtZW50IGdvZXMgaGVyZSAuLi4gLS0+DQogICAgPGNvbnRleHQgaWQ9IjAzIj4NCiAgICAgIDxlbnRpdHk+DQogICAgICAgIDxpZGVudGlmaWVyIHNjaGVtZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ib2IiPkJvYjwvaWRlbnRpZmllcj4NCiAgICAgIDwvZW50aXR5Pg0KICAgICAgPHBlcmlvZD4NCiAgICAgICAgPHN0YXJ0RGF0ZT4yMDIwLTAxLTAxPC9zdGFydERhdGU+DQogICAgICAgIDxlbmREYXRlPjIwMjAtMDEtMzE8L2VuZERhdGU+DQogICAgICA8L3BlcmlvZD4NCiAgDQogICAgICA8c2VnbWVudD4NCiAgICAgICAgICA8Ym9iOmxvY2F0aW9ucz5ib2I6aG9tZTwvYm9iOmxvY2F0aW9uPg0KICAgICAgICAgIDx4YnJsZGk6ZXhwbGljaXRNZW1iZXINCiAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbj0iYm9iOnBlcnNvbnNEaW0iPmJvYjpDaGlsZE9uZU1lbWJlcg0KICAgICAgICAgIDwveGJybGRpOmV4cGxpY2l0TWVtYmVyPg0KICAgICAgPC9zZWdtZW50Pg0KICANCiAgICAgIDxzY2VuYXJpbz4NCiAgICAgICAgICA8Ym9iOmFjdHVhbEJ1ZGdldD5ib2I6YWN0dWFsPC9ib2I6YWN0dWFsQnVkZ2V0Pg0KICAgICAgPC9zY2VuYXJpbz4NCiAgDQogICAgPC9jb250ZXh0Pg0KDQpgYGANCg0KTm93IGZhY3RzIHJlcG9ydGluZyBhY3R1YWwgZXhwZW5zZXMsIGZvciBob21lIGxvY2F0aW9uLCByZWxhdGluZyB0byBjaGlsZCBvbmUgZm9yIEphbnVhcnkgMjAyMCBjYW4gdXNlIHRoZSBhYm92ZSBjb250ZXh0IGFuZCBoYXZlIGFsbCBleHBlbnNlcyBncm91cHBlZCB1bmRlciBvbmUgaGVhZGluZyB1c2luZyB0aGUgYEV4cGVuc2VzQWJzdHJhY3RgIGVsZW1lbnQuDQoNCioqX05vdGVzXyoqIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgbWVtYmVycyBgZXhwbGljaXQgbWVtYmVyc2AsIGFuZCBgdHlwZWQgbWVtYmVyYCwgdGhlIGZpcnN0IHR5cGUgaXMgd2hlcmUgbWVtYmVycyBhcmUgZXhwbGljaXRseSBkZWZpbmVkIGluIHRoZSB0YXhvbm9teSBhbmQgbm8gb3RoZXIgbWVtYmVycyBjYW4gYmUgdXNlZCB3aXRoIHRoYXQgZG9tYWluIGV4Y2VwdCB0aGUgZGVmaW5lZCBtZW1iZXJzLiBPbiB0aGUgb3RoZXIgaGFuZCBgdHlwZWQgbWVtYmVyc2AsIG9ubHkgdHlwZSBvZiB0aGUgbWVtYmVyIGlzIGRlZmluZWQgaW4gdGhlIHRheG9ub215LCBhbmQgYW55IGNhbiBiZSB1c2VkIGlmIGl0IG1hdGNoZWQgdGhlIHR5cGUuICANCg0KS2VlcCBpbiBtaW5kIHRoYXQgWEJSTCBkaW1lbnNpb25zIHNwZWNpZmljYXRpb25zIHJlbHkgaGVhdmlseSBvbiB0aGUgbGlua2luZyBtZWNoYW5pc21zIHByb3ZpZGVkIGJ5IFhCUkwgdGhyb3VnaCBsaW5rYmFzZXMsIHdoaWNoIHdpbGwgYmUgdGhlIG5leHQgdG9waWMuICANCg0KIyMjIFhCUkwgTGlua2Jhc2VzICANCg0KV2UgaGF2ZSBsb29rZWQgYXQgaG93IHRvIGNyZWF0ZSB0YXhvbm9teSBlbGVtZW50cyBhbmQgdGF4b25vbXkgZGVmaW5lZCBkaW1lbnNpb25zLCBhbmQgaG93IHRvIHVzZSB0aGVzZSBlbGVtZW50cyBpbiBYQlJMIGluc3RhbmNlIHJlcG9ydCwgWEJSTCBsaW5rYmFzZXMgKGJhc2VkIG9uIFhNTCBYTGluaykgcHJvdmlkZXMgZm9yIGEgbWVjaGFuaXNtIHRvIGNyZWF0ZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhvc2UgZWxlbWVudHMgYW5kIHdpdGggb3RoZXIgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcmVzb3VyY2VzIHRvIGNyZWF0ZSBhIG1lYW5pbmdmdWwgc2VsZi1kZXNjcmliaW5nIGRhdGEgc3RydWN0dXJlLiAgDQoNCg0KIyMjIyBUaGUgYmFzaWNzICANCkFzIG1lbnRpb25lZCBYQlJMIG1ha2VzIHVzZSBvZiBYTUwgWExpbmsgc3BlY2lmaWNhdGlvbnMsIGdlbmVyYWxseSBzcGVha2luZywgdGhlcmUgYXJlIHR3byBtYWluIGNhdGVnb3JpZXMgb2YgbGlua3M6ICANCg0KKiBgU2ltcGxlIExpbmtzYDogQSBzaW1wbGUgbGluayBpbiBYTGluayBjcmVhdGVzIGEgdW5pZGlyZWN0aW9uYWwgaHlwZXJsaW5rIGZyb20gb25lIGVsZW1lbnQgdG8gYW5vdGhlciB0aHJvdWdoIGEgVVJJLiBUaGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBsaW5rICh0aGUgc291cmNlIGVsZW1lbnQpIGlzIGxpbmtlZCB0byBhIGRlc3RpbmF0aW9uIGVsZW1lbnQuIFRoaXMgZGVzdGluYXRpb24gZWxlbWVudCBpcyBub3QgY29ubmVjdGVkIHRvIHRoZSBzb3VyY2UgZWxlbWVudC4gVGhpcyBpcyBjb21tb24gaW4gSFRNTCBoeXBlcmxpbmtpbmcsIHdoZXJlIGEgbGluayBvbiBvbmUgd2Vic2l0ZSBtYXkgbGVhZCBhIHVzZXIgdG8gYW4gYWRkaXRpb25hbCB3ZWJzaXRlLCBidXQgdGhhdCBhZGRpdGlvbmFsIHdlYnNpdGUgbWF5IG5vdCBjb250YWluIGEgbGluayBiYWNrIHRvIHRoZSBzb3VyY2UgbG9jYXRpb24uICANCg0KKiBgRXh0ZW5kZWQgTGlua3NgOiBQcm92aWRlIGZvciBtdWx0aXBsZSByZXNvdXJjZXMgYXQgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiB0byBiZSBjb25uZWN0ZWQgdmlhIG11bHRpcGxlIGFyY3MuIEFuIGFyYyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luLCBkZXN0aW5hdGlvbiwgYW5kIHRoZSBiZWhhdmlvciBvZiBhIGxpbmsgYmV0d2VlbiB0d28gcmVzb3VyY2VzLiBUaGUgb3JpZ2luIHJlc291cmNlIGFuZCB0aGUgZGVzdGluYXRpb24gcmVzb3VyY2UgYXJlIGRlZmluZWQgYnkgbGFiZWxzLiAqKl9UaHJvdWdoIG9uZSBvciBtb3JlIGFyY3MsIGV4dGVuZGVkIGxpbmtzIGFjaGlldmUgY29tcGxleCBjb25uZWN0aW9ucyBhbW9uZyBtdWx0aXBsZSByZXNvdXJjZXNfKiouIExpa2Ugc2ltcGxlIGxpbmtzLCBleHRlbmRlZCBsaW5rcyBjYW4gZGVmaW5lIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBlbGVtZW50cyB3aXRoaW4gdGhlIHNhbWUgbmFtZXNwYWNlIG9yIGFjcm9zcyBkaWZmZXJlbnQgbmFtZXNwYWNlcy4gIA0KDQpJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0ICoqRXh0ZW5kZWQgTGlua3MqKiBjcmVhdGVzIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBlbGVtZW50cyB1c2luZyBgYXJjc2AgdGhhdCBkZXNjcmliZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSByZWxhdGlvbnNoaXAuDQoNClhCUkwgc3BlY2lmaWNhdGlvbnMgZGVmaW5lcyBzZXZlcmFsIHR5cGVzIG9mIGxpbmtzIGJhc2VkIG9uIFhMaW5rIHNwZWNzLCBtb3N0IGNvbW1vbiBsaW5rcyBhbmQgYXJjcyBhcmUgW1tiYXNlZCBvbiBYQlJMIEdsb3NzYXJ5XShodHRwczovL3d3dy54YnJsLm9yZy9ndWlkYW5jZS94YnJsLWdsb3NzYXJ5KV06ICANCg0KKiBgUHJlc2VudGF0aW9uIExpbmtzYDogQW4gZXh0ZW5kZWQgbGluayBwcm92aWRpbmcgZm9yIHRoZSBvcmdhbmlzYXRpb24gb2YgdGF4b25vbXkgZWxlbWVudHMgaW50byBhIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUgd2l0aCB0aGUgYWltIG9mIHByb3ZpZGluZyBhIG1lYW5zIG9mIHZpc3VhbGlzaW5nIG9yIG5hdmlnYXRpbmcgdGhlIHRheG9ub215LiBbQXQgYSB0ZWNobmljYWwgbGV2ZWwsIHRoZSBwcmVzZW50YXRpb24gdHJlZSBpcyBkZWZpbmVkIHVzaW5nIHRoZSBgcGFyZW50LWNoaWxkIGFyY3JvbGVgIGluIHRoZSBYQlJMIHNwZWNpZmljYXRpb25dDQoNCiogYENhbGN1bGF0aW9uIExpbmtzYDogQW4gZXh0ZW5kZWQgbGluIHByb3ZpZGluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gY29uY2VwdHMgaW4gYSB0YXhvbm9teSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVzY3JpYmluZyBhbmQgdmFsaWRhdGluZyBzaW1wbGUgdG90YWxzIGFuZCBzdWJ0b3RhbHMuIFtBdCBhIHRlY2huaWNhbCBsZXZlbCwgdGhlc2UgcmVsYXRpb25zaGlwcyBhcmUgZGVmaW5lZCB1c2luZyB0aGUgYHN1bW1hdGlvbi1pdGVtIGFyY3JvbGVgIGluIHRoZSBYQlJMIHNwZWNpZmljYXRpb25dICANCg0KKiBgTGFiZWwgbGlua3NgOiBBbiBleHRlbmRlZCBsaW5rIHByb3ZpZGluZyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbmNlcHQgYW5kIGh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIGEgdGF4b25vbXkgY29tcG9uZW50LiBYQlJMIGxhYmVscyBjYW4gYmUgZGVmaW5lZCBpbiBtdWx0aXBsZSBsYW5ndWFnZXMgYW5kIGNhbiBiZSBvZiBtdWx0aXBsZSB0eXBlcywgc3VjaCBhcyBhICJzdGFuZGFyZCBsYWJlbCIsIHdoaWNoIHByb3ZpZGVzIGEgY29uY2lzZSBuYW1lIGZvciB0aGUgY29tcG9uZW50LCBvciBhICJkb2N1bWVudGF0aW9uIGxhYmVsIiB3aGljaCBwcm92aWRlcyBhIG1vcmUgY29tcGxldGUgZGVmaW5pdGlvbiBvZiB0aGUgY29tcG9uZW50LiBFeGFtcGxlIG9mIGFyY3JvbGVzIGBsYWJlbGAsIGB0ZXJzZUxhYmVsYCwgYHBlcmlvZFN0YXJ0TGFiZWxgLCBgcGVyaW9kRW5kTGFiZWxgLCBgdG90YWxMYWJlbGANCg0KKiBgRGVmaW5pdGlvbiBMaW5rc2A6IEFuIGV4dGVuZGVkIHByb3ZpZGluZyBmb3IgcmVsYXRpb25zaGlwcyB0aGF0IGFycmFuZ2VzIHBhaXJzIG9mIGNvbmNlcHRzIGluIGEgc3BlY2lmaWMgc2VtYW50aWMgcmVsYXRpb25zaGlwLiBUaGVzZSByZWxhdGlvbnNoaXBzIG1heSBiZSBhYm92ZSBhbmQgYmV5b25kIGNhbGN1bGF0aW9uIG9yIHByZXNlbnRhdGlvbiByZWxhdGlvbnNoaXBzLiBDb25jZXB0IGNvcmUgZGltZW5zaW9ucyBjYW5ub3QgYmUgdXNlZCBpbiBhIGRlZmluaXRpb24gcmVsYXRpb25zaGlwLCBhbmQgaXMgcGltYXJpbHkgdXNlZCBmb3IgZGltZW5zaW9uYWwgcmVsYXRpb25zaGlwcyBpbiBYQlJMIERpbWVuc2lvbnMgc3BlY2lmaWNhdGlvbnMuIEV4YW1wbGUgYXJjcm9sZXMgYGh5cGVyY3ViZS1kaW1lbnNpb25gLCBgZGltZW5zdGlvbi1kb21haW5gLCBgZG9tYWluLW1lbWJlcmAsIGBkaW1lbnN0aW9uLWRlZnVhbHRgICANCg0KKiBgUmVmZXJlbmNlIGxpbmtgOiBBbiBleHRlbmRlZCBsaW5rIHByb3ZpZGluZyBmb3IgcmVsYXRpb24gYmV0d2VlbiBlbGVtZW50cyBvZiB0aGUgdGF4b25vbXkgYW5kIGV4dGVybmFsIHJlZmVyZW5jZSBzdWNoIGFzIGFjY291bnRpbmcgc3RhbmRhcnMsIG9yIGxhd3MuIEV4YW1wbGUgYXJjcm9sZSBgY29uY2VwdC1yZWZlcmVuY2VgLiAgDQoNCiogYEZvcm11bGEgbGlua2A6IEFuIGV4dGVuZGVkIGxpbmsgcHJvdmlkaW5nIHJlbGF0aW9ucyBuZWNlc3NhcnkgdG8gZGVmaW5lIGZvcm11bGFlIChYQlJMIEZvcm11bGEgU3BlY2lmaWNhdGlvbikgdXNlZCBpbiB2YWxpZGF0aW5nIFhCUkwgaW5zdGFuY2VzLiBFeGFtcGxlIGFyY3JvbGUgYHZhcmlhYmxlLXNldGAsIGB2YXJpYWJsZS1zZXQtZmlsdGVyYC4gIA0KDQoqIGBUYWJsZSBMaW5rYmFzZWA6IGFuIGV4dGVuZGVkIGxpbmsgcHJvdmlkaW5nIHJlbGF0aW9ucyBuZWVkZWQgZm9yIHRhYnVsYXIgdmlldyBvZiBhIHRheG9ub215IG9yIHJlcG9ydCB0aGF0IGlzIHVzZWQgZm9yIHByZXNlbnRhdGlvbiBvciBkYXRhIGVudHJ5IHB1cnBvc2VzLiBYQlJMIHJlcG9ydGluZyB0ZW1wbGF0ZXMgY2FuIHN1cHBvcnQgY29tcGxleCwgbXVsdGktZGltZW5zaW9uYWwgcmVwb3J0cywgc3VjaCBhcyB0aG9zZSBzZWVuIGluIHBydWRlbnRpYWwgcmVwb3J0aW5nLCBhbmQgcHJvdmlkZSBhIGJ1c2luZXNzIHVzZXItZnJpZW5kbHkgdmlldyBvZiB0aGUgZGF0YS4gWEJSTCByZXBvcnRpbmcgdGVtcGxhdGVzIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiBjbG9zZWQgcmVwb3J0aW5nIHByb2dyYW1tZXMsIHdoZXJlIGEgdGVtcGxhdGUgaXMgcHJlc2NyaWJlZCBieSB0aGUgY29sbGVjdG9yLiBbQXQgYSB0ZWNobmljYWwgbGV2ZWwsIFhCUkwgcmVwb3J0aW5nIHRlbXBsYXRlcyBhcmUgZGVmaW5lZCB1c2luZyB0aGUgVGFibGUgTGlua2Jhc2Ugc3BlY2lmaWNhdGlvbl0NCg0KDQoNCg0KDQoNCg0K